2013-06-04 5 views
9

Quando l'origine di una vista immagine è preimpostata dalla finestra di ispezione attributi, quando/come viene risolto il percorso effettivo del file? Sembra che non ci siano chiamate verso NSBundle, ma potrei sbagliarmi.Quando l'immagine di UIImageView è impostata da Interface Builder, come viene caricata l'immagine?

MODIFICA: Sto provando a far girare tutto il metodo che viene chiamato (se possibile) per sostituire dinamicamente le risorse in seguito.

enter image description here

+1

Non sarebbe solo essere relativo al pacchetto che il controllore è in vista? – borrrden

+1

Forse chiama [UIImage imageNamed:]? Non sono un ninja swizzle quindi non so come si possa ignorarlo. – morningstar

+0

Buona ipotesi, ma non sembra usare quel metodo. – kasrak

risposta

9

Nessuno di Gli iniziatori o le fabbriche UIImage vengono chiamati.
Ho effettuato alcune ricerche con debugger (su iOS Simulator 7.0.3) e trovato in seguito:
1) UIImageView che è impostato in IB è inizializzato tramite -initWithCoder:.
2) Nel metodo initWithCoder: viene chiamato il metodo decodeObjectForKey:. E (!) La chiave denominata UIImage contiene l'immagine di IB. Questa immagine è impostata su UIImageView tramite ivar, non tramite il set setImage:.
Quindi, sembra che IB imballi i dati di immagine grezzi in XIB/Storyboard durante la compilazione. Sciocchezze, ma vero.
Ecco perché non possiamo SWIZZLE +imageNamed: o qualche altro stabilimento e dobbiamo utilizzare il codice condizionale per le immagini di installazione per retina4 e iOS6

EDIT:

Commenti rivelano che hexdumping di file di IB compilato è png nome all'interno.

In effetti, guardando l'output di "Hexdump -C Byz-38-t0r-view-8bC-Xf-vdC.nib" indica che il nome del file PNG appare nel file compilato. Quindi, deve caricare i dati del file tramite il nome del file dallo stesso pacchetto.

Tuttavia, sono ancora caricati tramite qualche meccanismo interno, non tramite imageNamed:

+0

Sì ... quindi non c'è modo di scambiare qualche metodo come imageNamed? – jerrygdm

+0

È possibile trasformarlo in swizzle, ma per questa particolare attività non si otterrà alcun profitto –

+1

Il commento su "IB imballa i dati di immagine grezzi in XIB" non ha senso. Ho appena guardato uno storyboard compilato e ho scoperto che i dati dell'immagine non sono allineati nel file di output BYZ-38-t0r-view-8bC-Xf-vdC.nib. Infatti, guardando l'output di "hexdump -C BYZ-38-t0r-view-8bC-Xf-vdC.nib" indica che il nome file del PNG appare nel file compilato. Quindi, deve caricare i dati del file tramite il nome del file dallo stesso pacchetto. – MoDJ

2

iOS cercherà automaticamente il file overflow.png nello stesso fascio del file XI ter. Se il file xib si trova solo nella destinazione dell'applicazione, per impostazione predefinita viene visualizzato all'interno del pacchetto principale.

Se si desidera caricare programatically una nuova immagine in una visione di immagine e l'immagine è all'interno del fascio principale:

UIImage *image = [UIImage imageNamed:@"MyAwesomeImage"]; 
self.imageView.image = image; 

Se l'immagine è all'interno di un altro bundle:

NSBundle *imageBundle = ... // [NSBundle mainBundle] if your image is inside main bundle 
NSString *imagePath = [imageBundle pathForResource:@"MyAwesomeImage" ofType:@"png"]; 
UIImage *image = [UIImage imageWithContentsOfFile:imagePath]; 
self.imageView.image = image; 
+0

Sì, ma esiste un metodo chiamato per ottenere il sentiero? (Vedi modifica per motivazione). – kasrak

+0

@kasrak, vuoi il percorso dell'immagine overflow.png? È nel pacchetto principale? –

+0

Non penso di essere stato molto chiaro.Mi chiedo come il runtime inizializzi effettivamente UIImageView quando lo carica dallo storyboard/xib. Ciò consentirebbe la sostituzione automatica delle immagini nell'app senza modifiche al codice. – kasrak

Problemi correlati