2016-06-08 20 views
0

Ich versuche, nur die oberen Ecken (TopLeft und TopRight) einer Ansicht und Bildansicht zu runden. Mit dem untenstehenden Code konnte ich nur die linke Ecke abrunden (obwohl auch TopRight angegeben ist). Vielleicht sieht er die Beschränkung nicht, die dem Storyboard auferlegt wird.Glatt nur obere Winkel und Bildansicht in Swift

Wie repariere ich?

Vielen Dank.

let rectShape = CAShapeLayer() 
     rectShape.bounds = self.CopertinaImage1.frame 
     rectShape.position = self.CopertinaImage1.center 
     rectShape.path = UIBezierPath(roundedRect: self.CopertinaImage1.bounds, byRoundingCorners: [.TopRight, .TopLeft], cornerRadii: CGSize(width: 10, height: 10)).CGPath 

     self.CopertinaImage1.layer.backgroundColor = UIColor.greenColor().CGColor 
     self.CopertinaImage1.layer.mask = rectShape 

Die rechte Ecke ist immer das gleiche: enter image description here Edit:

Ich habe versucht, den folgenden Code in viewDidLayoutSubviews Abdrucken:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    let rectShape = CAShapeLayer() 
    rectShape.bounds = self.CopertinaImage1.frame 
    rectShape.position = self.CopertinaImage1.center 
    rectShape.path = UIBezierPath(roundedRect: self.CopertinaImage1.bounds, byRoundingCorners: [.TopRight, .TopLeft], cornerRadii: CGSize(width: 10, height: 10)).CGPath 
    self.CopertinaImage1.layer.backgroundColor = UIColor.greenColor().CGColor 
    self.CopertinaImage1.layer.mask = rectShape 
} 

Aber es hat nicht funktioniert .

+0

Wenn ehedem mit Auto-Layout Sie müssen Ihren Code nach der Auto-Layout-Engine Ihrer Ansicht des Frames beendet Einstellung gehen. Wahrscheinlich 'viewDidLayoutSubviews', wenn Sie diese – beyowulf

+0

versucht, in einem' UIViewController' tun, aber es funktioniert nicht ich unter den viewDidLoad eingegeben Überschreibung func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() lassen rectShape = CAShapeLayer() = rectShape.bounds self.CopertinaImage1.frame rectShape.position = self.CopertinaImage1.center rectShape.path = UIBezierPath (roundedRect: self.CopertinaImage1.bounds, byRoundingCorners: [.TopRight, .TopLeft], cornerRadii: CGSize (Breite: 10, Höhe: 10)). CGPath self.CopertinaImage1.layer.backgroundColor = UIColor.GreenColor(). CGColor self.CopertinaImage1.layer.Maske = RectShape –

+0

Ist die Ansicht, die Sie versuchen, in einer Unterklasse "UITableViewCell" zu maskieren? Wenn ja, sollte der Code in den 'LayoutSubviews' davon sein. Auch 'rectShape.bounds = self.CopertinaImage1.frame' und' rectShape.position = self.CopertinaImage1.center' scheinen mir falsch zu sein. Ich würde versuchen, sie zu ersetzen mit 'rectShape.frame = self.CopertinaImage1.bounds' – beyowulf

Antwort

0

Ich habe den Code, den Sie geschrieben haben versucht. Aus welchen Gründen auch immer, wenn ich Ihre Integritätsbedingungen eingeben und Ihre Ansichtshierarchie neu erstellen, ruft die Auto-Layout-Engine nach dem zweiten Durchlauf viewDidLayoutSubviews nicht auf. Ich könnte es erzwingen, aber self.view.layoutIfNeeded() von viewWillAppear aufrufen. Zum Beispiel:

override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 
     let rectShape = CAShapeLayer() 
     rectShape.frame = self.imageView.bounds 
     rectShape.path = UIBezierPath(roundedRect: self.imageView.bounds, byRoundingCorners: [.TopRight, .TopLeft], cornerRadii: CGSize(width: 10, height: 10)).CGPath 
     self.imageView.layer.backgroundColor = UIColor.greenColor().CGColor 
     self.imageView.layer.mask = rectShape 
} 

override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     self.view.layoutIfNeeded() 
    } 

Ergebnisse in:

enter image description here

Mit beiden Ecken abgerundet.

Ich würde sagen, eine bessere, elegantere Lösung, die diese Auto-Layout-Glitch vermeidet, ist nur den Eckenradius des Bildansichtscontainers zu setzen, da es so aussieht, als ob, was Sie sowieso tun. Zum Beispiel:

override func viewDidLoad() { 
     super.viewDidLoad() 
     self.imageView.clipsToBounds = true 
     self.imageContainerView.layer.cornerRadius = 10.0 
     self.imageContainerView.layer.masksToBounds = true 
    } 

Sie können dies auch von viewDidLoad tun, weil es nicht auf einem Ihrer Ansichten Frames abhängt gesetzt wird.

enter image description here

+0

Sie sind eine Legende! Jetzt funktioniert es, vielen Dank :) –

0

Ich habe gerade Ihren Code auf einem Spielplatz versucht. Hat gut für mich funktioniert. Vielleicht verstehe ich das Problem falsch.

enter image description here

+0

Dasselbe hier.Auf Spielplatz gearbeitet Ist es möglich, dass die obere rechts von einigen Container Sicht abgeschnitten wird? – DJohnson

+0

Ich sehe die rechte Ecke ist immer das Gleiche. Hier klicken -> https://dl.dropboxusercontent.com/u/22334399/Schermata%202016-06-09%20alle%2012.15.50.png –