2014-09-23 3 views
24

Sto cercando di utilizzare le immagini con la modalità di rendering dei modelli abilitata in Interface Builder ma non riesco a farlo funzionare. Con i pulsanti tutto funziona bene ma con ImageViews il tintColor non si applica all'immagine.Come utilizzare la modalità di rendering del modello in Xcode 6 Interface Builder?

Ho abilitato "Tipo di vettori" (sto usando pdf) e "Render come immagine modello" nelle risorse Immagine. Che cosa sto facendo di sbagliato?

+0

questa domanda è un duplicato di [Modifica UIImage renderingMode da file storyboard/XI ter] (http://stackoverflow.com/questions/19517334/modify-uiimage-renderingmode-from-storyboard-xib-file) – 0xced

risposta

32

Ho riscontrato lo stesso problema. Penso che questo sia un bug.

Si potrebbe duplicare questo radar http://openradar.appspot.com/radar?id=5334033567318016, che si riferisce a questa app di esempio minima https://github.com/algal/TemplateImagesBrokenDemo.

So di due soluzioni per questo problema

involucro in UIButton

Dal tintColor lavora per UIButtons, una soluzione è invece di UIImageView solo per usare un costume di tipo UIButton con userInteractionEnabled = false. Se si disattiva l'interattività del pulsante con UIView.userInteractionEnabled (anziché con UIControl.enabled), non si modificherà l'aspetto dell'immagine.

manualmente re-impostare l'immagine in codice

Un'altra soluzione è re-impostare la proprietà .image nel codice, dopo l'UIImageView è stato caricato dal pennino. Funziona perché l'impostazione di un'immagine nel codice sembra essere ciò che attiva la logica dei modelli. Perché funzioni, è necessario reimpostare l'immagine sul valore esistente in un modo che non verrà ottimizzato nel compilatore. Un frammento di come questo in awakeFromNib ha funzionato per me:

override func awakeFromNib() { 
    super.awakeFromNib() 

    if shouldSetImagesManually { 
    // the following three-lines should in theory have no effect. 
    // but in fact, they ensure that the UIImageView 
    // correctly applies its tintColor to the vector template image 

    let image = self.templateImageView.image 
    self.templateImageView.image = nil 
    self.templateImageView.image = image 
    } 
+1

Quindi, è davvero un bug. Grazie per la conferma. Beh, potrebbe essere una soluzione, si noti solo che il pulsante NON DEVE essere personalizzato per ottenere il colore. – rmvz3

+0

Penso che potresti esserti sbagliato su questo. Nell'app di esempio sul link github, il pulsante IS è personalizzato e riceve il colore tintaColore. – algal

+8

Ho scoperto che è sufficiente chiamare 'tintColorDidChange' su UIImageView. – Jaroslav

11

Nel mio caso il problema occures se l'applicazione è costruita con iOS 8 SDK ed è in esecuzione su iOS 7.

La mia soluzione è:

// this is the code that *should* work and does so on iOS 8 
UIColor *tintColor = [UIColor colorWithWhite:1.0 alpha:0.3]; 
[self.iconImageView setTintColor:tintColor]; 
self.iconImageView.image = [self imageForIconImageView]; // image is loaded from a pdf-resource (asset catalog set as Template) with imageNamed:@"resourceName" 

// this is the workaround to get tint on iOS 7  
if (!IS_IOS8_OR_HIGHER) { // macros checking iOS version* 

    UIImage *templateImage = [self.iconImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
    self.iconImageView.image = templateImage; 
} 

// * - macros is defined like so: 
// #define IS_IOS8_OR_HIGHER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) 
+0

Ho lo stesso problema. Il colore Tinta può essere applicato a un'immagine vettoriale in iOS 8 purché la modalità di rendering sia impostata su "Modello sempre" in IB o a livello di codice. Ma in iOS 7 il colore della tinta funziona solo se l'immagine stessa è impostata con la modalità di rendering, quindi aggiunta alla vista dell'immagine. – JimmyJammed

2

Un'altra soluzione che sembra funzionare per me è impostare controller.view su tintColor. Per ottenere il sistema di default colore della tinta di lavoro:

self.view.tintColor = self.view.tintColor; 

Come @ di alghe soluzione, non dovrebbe fare la differenza, ma lo fa.

4

Ecco la soluzione in codice meno semplice che ho trovato:

set tintColor in Runtime Attributes

+1

grazie, funziona –