2014-09-23 8 views
24

Ich versuche, Bilder mit Vorlage Rendering-Modus in Interface Builder aktiviert zu verwenden, aber ich kann es nicht funktionieren. Mit den Tasten funktioniert alles gut, aber mit ImageViews wird die tintColor nicht auf das Bild angewendet.Wie verwende ich den Template-Rendering-Modus im Xcode 6 Interface Builder?

Ich habe "Vektoren Typ" (ich verwende pdf) und "Als Vorlage Bild rendern" in den Bild Assets aktiviert. Was mache ich falsch?

+0

Diese Frage ist ein Duplikat [Modify UIImage rendering von Storyboard/xib Datei] (http://stackoverflow.com/questions/19517334/modify-uiimage-renderingmode-from-storyboard-xib-Datei) – 0xced

Antwort

32

Ich habe das gleiche Problem getroffen. Ich denke, das ist ein Fehler.

Sie könnten dieses Radar http://openradar.appspot.com/radar?id=5334033567318016 dupen, die auf dieses minimale Beispiel app https://github.com/algal/TemplateImagesBrokenDemo verweist.

Ich kenne zwei Abhilfen für dieses Problem

Wrap in UIButton

Seit tintColor für UIButtons arbeitet, ist eine Problemumgehung statt UIImageView nur mit userInteractionEnabled = false einen benutzerdefinierten Typ UIButton zu verwenden. Wenn Sie die Interaktivität der Schaltfläche mit UIView.userInteractionEnabled (im Gegensatz zu UIControl.enabled) deaktivieren, ändern Sie das Aussehen des Bildes nicht.

das Bild manuell in Code neu eingestellt

Eine andere Lösung ist es, die .image Eigenschaft im Code neu gesetzt wird, nachdem die von der UIImageView nib geladen wurde. Dies funktioniert, weil das Festlegen eines Bildes im Code die Templating-Logik auszulösen scheint. Damit dies funktioniert, müssen Sie das Bild auf den vorhandenen Wert zurücksetzen, sodass es im Compiler nicht optimiert wird. Ein Ausschnitt wie dies in awakeFromNib hat für mich gearbeitet:

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

Also, es ist wirklich ein Fehler. Danke für die Bestätigung. Nun, das könnte ein Workaround sein, beachte nur, dass die Schaltfläche NICHT Custom sein darf, um die tintColor zu erhalten. – rmvz3

+0

Ich denke, Sie könnten sich darin irren. In der Beispiel-App am GitHub-Link ist die Schaltfläche IS benutzerdefiniert und erhält die Farbe tintColor. – algal

+8

Ich habe festgestellt, dass es ausreicht, 'tintColorDidChange' auf UIImageView aufzurufen. – Jaroslav

11

In meinem Fall ist das Problem occures wenn die App mit iOS8 SDK gebaut und läuft auf iOS 7.

Meine Abhilfe ist:

// 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

Ich habe das gleiche Problem. Die Tönungsfarbe kann auf ein Vektorbild in iOS 8 angewendet werden, solange der Rendermodus entweder in IB oder programmgesteuert auf "Immer Vorlage" eingestellt ist. In iOS 7 funktioniert die Farbtonfarbe jedoch nur, wenn das Bild selbst mit dem Rendermodus eingestellt und dann zur Bildansicht hinzugefügt wird. – JimmyJammed

2

Eine andere Problemumgehung, die für mich zu arbeiten scheint, ist das Festlegen der tintColor der controller.view. Um die Standard-System-Tönungsfarbe Arbeits zu erhalten:

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

Wie @ Algen-Lösung, sollte es keinen Unterschied machen, aber es tut.

4

Hier ist die einfachste Code lose Lösung, die ich gefunden:

set tintColor in Runtime Attributes

+1

danke, es funktioniert –

Verwandte Themen