Unarchive UIImage对象在iOS 8上使用NSKeyedUnarchiver返回CGSizeZero图像 [英] Unarchive UIImage object returns CGSizeZero image using NSKeyedUnarchiver on iOS 8

查看:133
本文介绍了Unarchive UIImage对象在iOS 8上使用NSKeyedUnarchiver返回CGSizeZero图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在iOS 7上使用此代码:

I have this code working on iOS 7:

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

但在iOS 8上, imageCopy 's大小始终为零。当我归档 UIImageView 时,同样的事情发生了,未归档的imageView图像的大小为零。我发现在iOS 7中, UIImage 标题就像:

but on iOS 8, imageCopy's size is always zero. Same thing happens when I archive UIImageView, the unarchived imageView's image has a zero size. I found out that in iOS 7, UIImage header is like:

UIImage : NSObject <NSSecureCoding, NSCoding>

但在iOS 8上它是:

but on iOS 8 it is :

UIImage : NSObject <NSSecureCoding>

看起来缺少 NSCoding 协议在iOS 8.我必须编码实际的图像数据: UIImagePNGRepresentation(self.imageView.image)而不是图像,以确保我得到一个良好的图像。

It looks like the NSCoding protocol is missing on iOS 8. I have to encode the actual image data: UIImagePNGRepresentation(self.imageView.image) instead of the image to make sure I get a good image back.

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

Does anyone know why this happens? Is it for backward compatibility? I noticed in iOS earlier version UIImage doesn't conform to NSCoding.

推荐答案

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

UIImage : NSObject <NSSecureCoding> is not a problem because NSSecureCoding inherits NSCoding.

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

Anyway, I confirmed the problem can be reproduced with following code:

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

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

On the other hand, the following code works as expected:

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 ?

I don't know why, maybe bug?

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

I think, this is related to imageAsset or traitCollection property introduced in iOS8

这篇关于Unarchive UIImage对象在iOS 8上使用NSKeyedUnarchiver返回CGSizeZero图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆