2016-03-18 21 views
0

Also ich habe auf diesem eine Weile stecken geblieben, las und versuchte viele verschiedene Lösungen online, kann aber nicht herausfinden, was ich falsch mache. Was ich versuche zu erreichen, sollte sehr einfach sein: Ich habe eine UIView und ich möchte die unteren linken und rechten Ecken abrunden, so dass sie abgeschnitten und nicht gezeichnet werden.Benutzerdefinierte Rundung Ecken auf UIView

Dies ist, was ich bisher (vwView ist mein Auslass für eine benutzerdefinierte Ansicht auf dem Bildschirm):

var layerTest = CAShapeLayer() 

var bzPath = UIBezierPath(roundedRect: vwView.bounds, byRoundingCorners: [.BottomLeft, .BottomRight], cornerRadii: CGSizeMake(10, 10)) 
layerTest.path = bzPath.CGPath 

vwView.layer.mask = layerTest; 

Was mache ich falsch? AUCH: Dies ist nur mein Prototyp, weil ich das wirklich auf einer UITableViewCell machen möchte, also wenn es einen anderen Ansatz gibt, den ich dafür nehmen muss, könnte das auch hilfreich sein.

Dank

James

+0

Scheint für mich zu arbeiten. Welches Ergebnis bekommst du? – beyowulf

+0

Haben Sie versucht, den Rahmen Ihrer Ebene festzulegen? 'layerTest.frame = vwView.bounds'? – Losiowaty

Antwort

1

Das Problem ist, dass vwView später verkleinert wird auf den Bildschirm passen, aber Sie nicht den Weg für die neue Größe aktualisieren. Es gibt keine besonders triviale Lösung dafür. Sie müssen im Grunde vwView eine benutzerdefinierte Klasse (wenn es nicht bereits ist) und aktualisieren Sie die Maske in layoutSubviews. Beispiel:

public class RoundedBorderView: UIView { 

    public var roundedCorners: UIRectCorner = [ .BottomLeft, .BottomRight ] { 
     didSet { self.setNeedsLayout() } 
    } 

    public var cornerRadii: CGSize = CGSizeMake(10, 10) { 
     didSet { self.setNeedsLayout() } 
    } 

    public override func layoutSubviews() { 
     super.layoutSubviews() 
     updateMask() 
    } 

    private func updateMask() { 
     let mask = maskShapeLayer() 
     mask.path = UIBezierPath(roundedRect: bounds, byRoundingCorners: roundedCorners, cornerRadii: cornerRadii).CGPath 
    } 

    private func maskShapeLayer() -> CAShapeLayer { 
     if let mask = layer.mask as? CAShapeLayer { 
      return mask 
     } 
     let mask = CAShapeLayer() 
     layer.mask = mask 
     return mask 
    } 

} 

Ändern Sie die Klasse von vwView-RoundedBorderView und es wird seine eigene Maskenschicht erhalten.

+0

Danke Rob! Das hat super funktioniert und du hast tollen Code! –

Verwandte Themen