2016-06-05 39 views
0

Ich habe eine benutzerdefinierte UIView, in der ich mehrere praktische Zeichenmethoden implementiere, die es mir erlauben, Eckenradien bestimmter Ecken zu setzen, Grenzen zu zeichnen und Farbverläufe anstelle einer Hintergrundfarbe zu verwenden. Ich erreiche dies durch Überschreiben drawRect(rect:CGRect). Trotz der Verwendung von CGContextClip zum Zeichnen von Zeichnungen an den generierten CGPathRef wird die Hintergrundfarbe immer gezeichnet, um die Grenzen der Ansicht zu füllen. Das liegt daran, dass der Layer der Ansicht vor dem Aufruf von drawRect gezeichnet wird.Wie verhindert man, dass CALayer Hintergrundfarbe zeichnet?

Abgesehen von dem Überschreiben der Setter für backgroundColor gibt es andere Möglichkeiten, nur zeichnen, was ich in drawRect angeben? Ich möchte die Ebene NICHT mit einem CAShapeLayer oder etwas Ähnlichem maskieren. Es sollte weiterhin möglich sein, eine Unterklasse zu erstellen und außerhalb der Grenzen der Ebene zu zeichnen.

+1

Setzen Sie die 'backgroundColor', um die Farbe zu löschen und den Setter zu überschreiben. Das ist das einzige, was du tun kannst. Beachten Sie auch die Eigenschaften 'clearsContextBeforeDrawing' und' opaque'. – Sulthan

+0

Ja, ich benutze derzeit die Methode override backgroundColor, aber ich fragte mich, ob es einen besseren Weg gab. Scheint nicht zu sein. – GoldenJoe

Antwort

0

Sie könnten Glück finden, indem Sie Ihre view.layer.masksToBounds = true einstellen.

0

Wird [super drawRect: frame] am Ende der drawRect: Methode funktioniert?

2

Sie können die Art ändern, wie der Hintergrund durch eine CALayer-Unterklasse gezeichnet wird.

Durch den Aufruf von super.draw in Ihrer CALayer-Unterklasse wird der Hintergrund gezeichnet. Wenn Sie das weglassen, wird der Hintergrund nicht gezeichnet. (Sie müssen auch UIView.draw oder die Methode überschrieben wird nicht aufgerufen werden)

class CustomDrawingLayer: CALayer { 
    override func draw(in ctx: CGContext) { 
    // super.draw(in: ctx) don't call to prevent default drawing behaviour 

    // custom drawing code 
    } 
} 

Wenn Sie die Hintergrundfarbe im Hinblick auf etwas anderes als klar zu ändern, wird der Träger CALayer.isOpaque auf true gesetzt werden die entfernt den Alphakanal aus der Schicht, wenn die undurchsichtige Farbe nicht gezogen wird, dann wird der Hintergrund schwarz sein, können Sie dieses Verhalten durch Überschreiben die variablen

override var isOpaque: Bool { 
    get { 
     return false 
    } 
    set { 
     // you can leave this empty... 
    } 
} 

eine einfachere Lösung für das Problem eingestellt wäre verhindern können die Hintergrundfarbe der Ansicht, um den Hintergrund zu löschen und zu zeichnen, wie Sie in Ihrer Ansicht möchten.

Verwandte Themen