基本上,我使用的是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
答案 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像素区域的平铺区域。