使用resizableImageWithCapInsets崩溃:UIEdgeInsetsMake

时间:2013-01-25 18:47:09

标签: ios uitableview uiimage

基本上,我使用的是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

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,这只发生在iOS5.x设备调整UIImageView的大小,这个UIImage以这种方式显示了创建的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或更高。

答案 1 :(得分:0)

仅供参考。

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

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

  

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

     

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