2014-10-06 9 views
5

Ho questo codice funzionante su iOS 7:oggetto UIImage Annulla archiviazione restituisce un'immagine CGSizeZero utilizzando NSKeyedUnarchiver su iOS 8

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

ma su iOS 8, dimensioni imageCopy s' è sempre zero. La stessa cosa accade quando archivio UIImageView, l'immagine di imageView non archiviata ha una dimensione zero. Ho scoperto che in iOS 7, UIImage intestazione è come:

UIImage : NSObject <NSSecureCoding, NSCoding> 

ma su iOS 8 è:

UIImage : NSObject <NSSecureCoding> 

Sembra che il protocollo NSCoding manca su iOS 8. Devo codificare i dati effettivi dell'immagine: UIImagePNGRepresentation(self.imageView.image) invece dell'immagine per assicurarmi di ottenere una buona immagine indietro.

Qualcuno sa perché questo accade? È per la retrocompatibilità? Ho notato in iOS versione precedente UIImage non conforme a NSCoding.

+0

Questo codice funziona bene su iOS 8/Xcode6 almeno per me. Ottengo {0, 0} solo per le immagini che sono nul, per tutti gli altri ottengo {640, 640} ecc. – kabarga

+0

Non funziona per me, sto usando Xcode6 Versione 6.0.1 su iOS8, e tu? – gabbler

+0

Versione 6.0.1 (6A317) e provato su iPhone 5s. – kabarga

risposta

7

UIImage : NSObject <NSSecureCoding> non è un problema perché NSSecureCoding eredita NSCoding.

In ogni caso, ho confermato il problema può essere riprodotto con seguente codice:

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

D'altra parte, il seguente codice funziona come previsto:

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} 

io non so perché, forse bug?

penso, questo è legato alla imageAsset o traitCollection proprietà introdotta in iOS 8

+0

Davvero! Ottengo lo stesso risultato del tuo, l'altro modo ha funzionato, ho trovato il problema su imageView, dopo l'annullamento dell'archiviazione, la dimensione dell'immagine della copia di imageView è zero, cosa pensi che abbia causato ciò? Il codice nella mia domanda utilizza self.imageView.image, l'immagine proviene dalla cache, non dal pacchetto di risorse. – gabbler

+0

Beh, non ne ho idea, mi dispiace :) – rintaro

+0

lo passo metà giornata. facepalm. E RISPONDE OPERE! –