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

我遇到了同样的问题,这只发生在 iOS5.x 调整 UIImageView 大小的设备上,该 UIImageView 显示了以这种方式创建的 UIImage:

    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 文档中被弃用但不在框架中,这意味着您可以在 iOS5.x 设备上运行应用程序时使用它而不会出现任何问题,并在 iOS 6 或更高版本的设备上使用新支持的方法.

于 2013-01-31T10:27:22.710 回答
0

仅供参考。

我也遇到了类似的崩溃,修复实际上不在代码中,而是在资产本身中。

正如 Apple 文档所述,资产的可调整大小区域需要为 1px x 1px,因此请确保它是。

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

在图像的缩放或调整大小期间,被帽子覆盖的区域不会被缩放或调整大小。相反,每个方向上未被帽覆盖的像素区域从左到右和从上到下平铺,以调整图像大小。这种技术通常用于创建可变宽度按钮,这些按钮保留相同的圆角,但其中心区域会根据需要增大或缩小。为获得最佳性能,请使用大小为 1x1 像素区域的平铺区域。

于 2013-10-25T10:16:58.630 回答