2014-10-06 11 views
5

Mam ten kod pracujących na iOS 7:Zdezarchiwizuj obiektu UIImage zwraca CGSizeZero obraz przy użyciu NSKeyedUnarchiver na iOS 8

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

ale na iOS 8, rozmiar imageCopy „s jest zawsze zero. To samo dzieje się, gdy archiwizuję UIImageView, obraz zarchiwizowany w ramach obrazu stanu ma zerowy rozmiar. I okazało się, że w iOS 7, UIImage nagłówek jest tak:

UIImage : NSObject <NSSecureCoding, NSCoding> 

ale na iOS 8 to:

UIImage : NSObject <NSSecureCoding> 

Wygląda protokołu NSCoding brakuje na iOS 8. Mam do kodowania rzeczywiste dane obrazu: UIImagePNGRepresentation(self.imageView.image) zamiast obrazu, aby upewnić się, że otrzymam dobry obraz z powrotem.

Czy ktoś wie, dlaczego tak się dzieje? Czy to dla kompatybilności wstecznej? Zauważyłem, że w poprzedniej wersji iOS UIImage nie jest zgodny z NSCoding.

+0

Ten kod działa poprawnie na systemów iOS 8/Xcode6 przynajmniej dla mnie. Dostaję {0, 0} tylko dla obrazów, które są zerowe, dla wszystkich innych dostaję {640, 640} itd. – kabarga

+0

Nie działa dla mnie, używam Xcode6 wersji 6.0.1 na iOS8, a ty? – gabbler

+0

Wersja 6.0.1 (6A317) i wypróbowana na iPhone 5s. – kabarga

Odpowiedz

7

nie jest problemem, ponieważ NSSecureCoding dziedziczy NSCoding.

Zresztą potwierdził, że problem może być powielana z następującego kodu:

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

Natomiast poniższy kod działa zgodnie z oczekiwaniami:

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} 

nie wiem dlaczego, może błąd?

myślę, że jest to związane z imageAsset lub traitCollection własności wprowadzonej w systemów iOS 8

+0

Naprawdę! Otrzymałem taki sam wynik jak twój, w inny sposób zadziałało, po pierwsze znalazłem problem na imageView, po cofnięciu archiwizacji rozmiar obrazu imageView wynosi zero, co, według ciebie, spowodowało to? Kod w moim pytaniu użył self.imageView.image, obraz pochodzi z pamięci podręcznej, a nie z pakietu zasobów. – gabbler

+0

Cóż, nie mam pojęcia, przepraszam :) – rintaro

+0

spędzam na nim pół dnia. facepalm. I ODPOWIEDŹ DZIAŁA! –

Powiązane problemy