崩溃使用resizableImageWithCapInsets:UIEdgeInsetsMake

基本上,我使用resizableImageWithCapInsets:UIEdgeInsetsMake。 但我不确定这是否是我的崩溃的来源。 我将这些可resize的图像添加到我的表格单元格中。 我不完全确定这是如何发生的。

这是日志。

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 

我有同样的问题,这只发生在设备与iOS5.x调整UIImageView的大小,以这种方式创build的UIImage:

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

这可能是iOS6.x中已经修复的iOS错误

如果您的情况是使用镜像条件调整图像大小,则可以使用以下方法:

创build一个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.0中正常运行应用程序而没有任何问题的情况下使用它,并且可以在iOS 6或更高版本的设备上使用新支持的方法。

只是供参考。

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

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

– (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

在对图像进行缩放或resize的过程中,不会缩放或resize。 相反,在每个方向上没有被帽覆盖的像素区域被平铺,从左到右和从上到下,以调整图像的大小。 这种技术通常用于创build可变宽度的button,它们保留相同的圆angular,但其中心区域根据需要增长或缩小。 为获得最佳性能,请使用大小为1×1像素区域的平铺区域。