2017-03-21 1 views
0

Ich versuche, einen benutzerdefinierten Farbverlaufslayer zu erstellen, den ich im Interface Builder für meine verschiedenen Ansichten wiederverwenden kann. Ich habe die folgende Klasse:Sublayer des benutzerdefinierten Elements, das nicht im Simulator rendert, rendert im Interface Builder

Import UIKit

@IBDesignable 
class MyGradientLayer: UIView { 

    let gradient = CAGradientLayer() 

    public override init(frame: CGRect) { 
     super.init(frame: frame) 

     gradient.colors = [startColor.cgColor, endColor.cgColor] 
     gradient.frame = self.bounds 
     gradient.locations = [0, 1] 
     self.layer.insertSublayer(gradient, at: 0) 
    } 

    public required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    @IBInspectable 
    public var startColor: UIColor = UIColor.init(red: 1, green: 0.364, blue: 0.22352, alpha: 1.0) { 
     didSet { 
      gradient.colors = [startColor.cgColor, endColor.cgColor] 
     } 
    } 

    @IBInspectable 
    public var endColor: UIColor = UIColor.init(red: 1, green: 0.1607, blue: 0.40392, alpha: 1.0) { 
     didSet { 
      gradient.colors = [startColor.cgColor, endColor.cgColor] 
     } 
    } 

    override func layoutSubviews() { 
     gradient.frame = self.bounds 
     gradient.locations = [0, 1] 
     super.layoutSubviews() 
    } 

} 

ich dann eine UIView zu meinem Viewcontroller hinzugefügt und die Klasse zu MyGradientLayer im Identity Inspektoren festgelegt werden. Meine nette kleine Farbverlaufsansicht wird dann im Interface Builder gut dargestellt. Ich gehe weiter und setze die Einschränkungen so, dass sie den gesamten Bildschirm einnehmen (Ich habe manuelle und automatische Einschränkungen versucht). Alles ist gut, oder?

Nein, die Gradientenebene wird im Simulator nicht dargestellt. Ich weiß jedoch, dass die Ansicht dort ist und auf dem Bildschirm angezeigt wird, weil ich die Hintergrundfarbe der UIView in IB einstellen kann, und es auf dem ganzen Bildschirm zeigt.

Haben Sie irgendwelche Gedanken, warum der Farbverlaufslayer in meinem benutzerdefinierten UIView im Simulator nicht dargestellt wird?

Danke!

Antwort

0

Sehen Sie, was passiert, wenn Sie die „init“ wie folgt ändern:

public override init(frame: CGRect) { 
    super.init(frame: frame) 
    self.commonInit() 
} 

public required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    self.commonInit() 
} 

func commonInit() { 

    gradient.colors = [startColor.cgColor, endColor.cgColor] 
    gradient.frame = self.bounds 
    gradient.locations = [0, 1] 
    self.layer.insertSublayer(gradient, at: 0) 

} 

Je nachdem, wie es verwendet wird, können Sie eine Flagge zu verhindern commonInit aus werden mehr genannt als einmal festlegen müssen. Probieren Sie es aus und sehen Sie.

+0

Das war es. Ich habe es gerade herausgefunden und kam, um die Frage zu aktualisieren. Wenn der Interface Builder ihn anzeigt, verwendet er das Init (Frame), aber wenn es tatsächlich gerendert wird, verwendet es die Coder-Version. Ich bin mir nicht sicher warum (ehrlich gesagt, so viele Dinge sind mir in dieser Umgebung verwickelt), aber das war die Lösung! –

Verwandte Themen