2014-10-06 16 views
5

tôi có mã này làm việc trên iOS 7:đối tượng UIImage Unarchive trả CGSizeZero hình ảnh sử dụng NSKeyedUnarchiver trên iOS 8

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

nhưng trên iOS 8, kích thước imageCopy 's luôn là zero. Điều tương tự cũng xảy ra khi tôi lưu trữ UIImageView, hình ảnh của chế độ xem hình ảnh không lưu trữ có kích thước bằng không. Tôi phát hiện ra rằng trong iOS 7, UIImage tiêu đề là như sau:

UIImage : NSObject <NSSecureCoding, NSCoding> 

nhưng trên iOS 8 nó là:

UIImage : NSObject <NSSecureCoding> 

Dường như các giao thức NSCoding là mất tích trên iOS 8. Tôi có để mã hóa dữ liệu hình ảnh thực tế: UIImagePNGRepresentation(self.imageView.image) thay vì hình ảnh để đảm bảo tôi có được hình ảnh tốt.

Có ai biết tại sao điều này xảy ra không? Nó có tương thích ngược không? Tôi nhận thấy trong phiên bản trước đó của iOS UIImage không phù hợp với NSCoding.

+0

Mã này hoạt động tốt trên iOS8/Xcode6 ít nhất đối với tôi. Tôi nhận được {0, 0} chỉ cho hình ảnh là không, cho tất cả những người khác tôi nhận được {640, 640} vv – kabarga

+0

Không làm việc cho tôi, tôi đang sử dụng Xcode6 Phiên bản 6.0.1 trên iOS8, còn bạn thì sao? – gabbler

+0

Phiên bản 6.0.1 (6A317) và đã thử trên iPhone 5s. – kabarga

Trả lời

7

UIImage : NSObject <NSSecureCoding> không phải là vấn đề vì NSSecureCoding kế thừa NSCoding.

Dù sao, tôi khẳng định vấn đề có thể được sao chép với đoạn mã sau:

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

Mặt khác, các mã sau đây làm việc như mong đợi:

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} 

Tôi không biết tại sao, có thể là lỗi?

Tôi nghĩ rằng, điều này có liên quan đến imageAsset hoặc traitCollection bất động sản được giới thiệu vào iOS8

+0

Thực sự! Tôi nhận được kết quả tương tự như của bạn, cách khác làm việc, trước tiên tôi đã tìm thấy vấn đề trên imageView, sau khi hủy lưu trữ, kích thước hình ảnh của bản sao imageView là 0, bạn nghĩ điều gì đã gây ra điều đó? Mã trong câu hỏi của tôi đã sử dụng self.imageView.image, hình ảnh từ bộ nhớ cache, không phải từ gói tài nguyên. – gabbler

+0

Vâng, tôi không có ý tưởng, xin lỗi :) – rintaro

+0

tôi chi tiêu vào nó một nửa trong ngày. facepalm. VÀ TRẢ LỜI TRẢ LỜI! –

Các vấn đề liên quan