+imageWithContentsOfFile:
是同步的,所以您的主线程上的UI被从磁盘操作加载的映像阻塞并导致不连续。解决方案是使用从磁盘异步加载文件的方法。你也可以在后台线程中做到这一点。这可以通过将+imageWithContentsOfFile:
包装在dispatch_async()
中,然后在主队列上嵌套dispatch_async()
来实现,因为UIKit方法需要在主线程上运行,所以在主队列上包装-setBackgroundImage:
。如果您希望图像在视图加载后立即出现,您需要预先从磁盘缓存图像,以便在视图出现时立即将其存储在内存中。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
UIImage *image = [UIImage imageWithContentsOfFile:frontPath];
dispatch_async(dispatch_get_main_queue(), ^{
[self.frontButton setBackgroundImage:image forState:UIControlStateNormal];
});
});
顺便说一句,如果按钮图像发生渐变,可以考虑使用以下属性,以确保从磁盘加载图像文件很小:
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets
或(不建议使用,只有当你使用需要支持iOS 4.x):
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight
你救我一命!谢谢! –
@Andrew你如何预缓存? re:“你需要预先从磁盘缓存图像” –
@Van Du Tran,在这种情况下预缓存意味着在你需要之前(例如在视图出现之前)将图像加载到UIImage中。这样,当您加载视图时,图像已经保存在内存中,因此无需磁盘I/O即可将其显示在屏幕上。 – Andrew