0

基本的に、私は resizableImageWithCapInsets:UIEdgeInsetsMake を使用しています。しかし、これが私のクラッシュの原因であるかどうかはわかりません。これらのサイズ変更可能な画像を表のセルに追加しています。これがどのように起こっているのか正確にはわかりません。

これがログです。

 Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
    Exception Codes: KERN_INVALID_ADDRESS at 0xa1eab0c4
    Crashed Thread:  0

    Thread 0 name:  Dispatch queue: com.apple.main-thread
    Thread 0 Crashed:
    0   libobjc.A.dylib                 0x3966c5d0 objc_msgSend + 16
    1   Foundation                      0x3aa1750c probeGC + 60
    2   Foundation                      0x3aa1d526 -[NSConcreteMapTable removeObjectForKey:] + 30
    3   UIKit                           0x39e9f46c -[_UIImageViewPretiledImageWrapper dealloc] + 76
    4   libobjc.A.dylib                 0x3966e490 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 164
    5   CoreFoundation                  0x3a72882c _CFAutoreleasePoolPop + 12
    6   Foundation                      0x3aa12e10 -[NSAutoreleasePool release] + 116
    7   UIKit                           0x39b0f80c -[UITableView layoutSubviews] + 220
    8   UIKit                           0x39acb892 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 254
    9   QuartzCore                      0x37fce4e6 -[CALayer layoutSublayers] + 210
    10  QuartzCore                      0x37fce088 CA::Layer::layout_if_needed(CA::Transaction*) + 456
    11  QuartzCore                      0x37fcefac CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 12
    12  QuartzCore                      0x37fce996 CA::Context::commit_transaction(CA::Transaction*) + 234
    13  QuartzCore                      0x37fce7a8 CA::Transaction::commit() + 312
    14  QuartzCore                      0x37fce60c CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 56
    15  CoreFoundation                  0x3a7ba93e __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 18
    16  CoreFoundation                  0x3a7b8c34 __CFRunLoopDoObservers + 272
    17  CoreFoundation                  0x3a7b8f8e __CFRunLoopRun + 742
    18  CoreFoundation                  0x3a72c238 CFRunLoopRunSpecific + 352
    19  CoreFoundation                  0x3a72c0c4 CFRunLoopRunInMode + 100
    20  GraphicsServices                0x37a65336 GSEventRunModal + 70
    21  UIKit                           0x39b1c28c UIApplicationMain + 1116
4

2 に答える 2

2

私は同じ問題を抱えていました。これは、この方法で作成された UIImage を表示する UIImageView のサイズを変更する iOS5.x を搭載したデバイスでのみ発生していました。

    UIEdgeInsets edgeInsets = UIEdgeInsetsMake(topCapHeight, leftCapWidth, topCapHeight, leftCapWidth);
    image = [originalImage resizableImageWithCapInsets:edgeInsets];

これはおそらく iOS6.x で修正された iOS のバグです。

ケースがミラー基準で画像のサイズを変更している場合は、次の方法を使用できます。

UIImage のカテゴリを作成し、このインスタンス メソッドを追加します。

- (UIImage*)resizableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight </b>
{
    UIImage *image = nil;    
    float osVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (osVersion < 6.0) {
        image = [self stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:topCapHeight];
    } else {
        UIEdgeInsets edgeInsets = UIEdgeInsetsMake(topCapHeight, leftCapWidth, topCapHeight, leftCapWidth);
        image = [self resizableImageWithCapInsets:edgeInsets];
    }
    return image;
}

メソッド: - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight

これは、iOS 5.x のデバイスでアプリを実行しているときに問題なく使用でき、iOS 6 以降のデバイスで新しいサポートされている方法を使用できることを意味します。 .

于 2013-01-31T10:27:22.710 に答える
0

参考までに。

これに似たクラッシュもありましたが、修正は実際にはコードではなく、アセット自体にありました。

Apple のドキュメントに記載されているように、アセットのサイズ変更可能な領域は 1 ピクセル x 1 ピクセルである必要があるため、必ずそうてください。

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

画像のスケーリングまたはサイズ変更中、キャップで覆われた領域はスケーリングまたはサイズ変更されません。代わりに、各方向のキャップで覆われていないピクセル領域が、左から右、上から下にタイル化され、画像のサイズが変更されます。この手法は、可変幅のボタンを作成するためによく使用されます。ボタンの角は同じ丸みを保ちますが、必要に応じて中央領域が拡大または縮小します。最高のパフォーマンスを得るには、サイズが 1x1 ピクセル領域のタイル領域を使用してください。

于 2013-10-25T10:16:58.630 に答える