我的代码在 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/