ios - Unarchive UIImage 对象在 iOS 8 上使用 NSKeyedUnarchiver 返回 CGSizeZero 图像

标签 ios objective-c xcode uiimage ios8

我的代码在 iOS 7 上运行:

NSData *imageData = [NSKeyedArchiver archivedDataWithRootObject:self.imageView.image];
UIImage *imageCopy = [NSKeyedUnarchiver unarchiveObjectWithData:imageData];
NSLog(@"%@",NSStringFromCGSize(imageCopy.size));

但在 iOS 8 上,imageCopy 的大小始终为零。当我存档 UIImageView 时,也会发生同样的事情,未存档的 imageView 的图像大小为零。我发现在 iOS 7 中,UIImage header 是这样的:

UIImage : NSObject <NSSecureCoding, NSCoding>

但在 iOS 8 上是:

UIImage : NSObject <NSSecureCoding>

看起来 iOS 8 上缺少 NSCoding 协议(protocol)。我必须对实际图像数据进行编码:UIImagePNGRepresentation(self.imageView.image) 而不是图像以确保我获得良好的形象。

有人知道为什么会这样吗?是为了向后兼容吗?我注意到在 iOS 早期版本中 UIImage 不符合 NSCoding

最佳答案

UIImage : NSObject <NSSecureCoding>这不是问题,因为 NSSecureCoding继承NSCoding .

无论如何,我确认问题可以通过以下代码重现:

UIImage *img = [UIImage imageNamed: @"myImage"];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:img];
UIImage *imgCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"%@, %@", imgCopy, NSStringFromCGSize(imgCopy.size)); // -> (null), {0, 0}

另一方面,以下代码按预期工作:

UIImage *img = [UIImage imageNamed: @"myImage"];
UIImage *img2 = [UIImage imageWithCGImage:img.CGImage scale:img.scale orientation:img.imageOrientation];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:img2];
UIImage *imgCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"%@, %@", imgCopy, NSStringFromCGSize(imgCopy.size)); // -> <UIImage: 0x7fa013e766f0>, {50, 53}

不知道为什么,可能是bug?

我认为,这与imageAsset有关或 traitCollection iOS8中引入的属性

关于ios - Unarchive UIImage 对象在 iOS 8 上使用 NSKeyedUnarchiver 返回 CGSizeZero 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26213575/

相关文章:

ios - 滑动 tableViews(很像日历)

iphone - 在 main.m 中设置的自定义背景图像在整个应用程序中使用?

ios - 在 ScrollView 上使用 UIDynamicAnimator?

ios - UITableViewController 中的 UISearchBar?

ios - 我们如何禁用 future 日期并在 swift 中在日期标签下方传递副标题以及如何使用桥头

xcode - 在 xcode 单元测试中加载文件

ios - 向 iOS 应用程序添加文本到语音功能

ios - 为 CollectionViewCell 创建 IBAction

ios - 将 Core Data 相关代码迁移到 Swift 2

ios - 使 NSNumberFormatter 始终将输入的最右边两位数视为小数部分