2017-02-27 4 views
0

In benutzerdefinierte TabelleView-Zelle möchte ich UIView mit abgerundeten Ecken auf der Oberseite erstellen. Hier ist der Teil des Codes, wo ich die Einstellung der Zwänge der UIViewAbgerundete Ecken ändert UIView Größe

headerView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 8).isActive = true 
headerView.topAnchor.constraint(equalTo: self.topAnchor, constant: 4).isActive = true 
headerView.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -8).isActive = true 
headerView.heightAnchor.constraint(equalToConstant: 40).isActive = true 

Bellow dieses Teils abgerundeten Ecken Sicht gesetzt ich getan habe folgendes:

self.layoutIfNeeded() 
let rectShape = CAShapeLayer() 
rectShape.bounds = headerView.layer.frame 
rectShape.position = headerView.center 
rectShape.path = UIBezierPath(roundedRect: headerView.layer.bounds, byRoundingCorners: [ .topLeft, .topRight], cornerRadii: CGSize(width: 10, height: 10)).cgPath 
headerView.layer.backgroundColor = UIColor.green.cgColor 
headerView.layer.mask = rectShape 

Das Problem ist, dass, wenn Dieser Codeblock wird verwendet, um abgerundete Ecken zu setzen. Die Größe der Ansicht ändert sich. Hier ist die Ausgabe

enter image description here

Und das Ergebnis ohne diesen Teil des Codes ist folgende:

enter image description here

Meine Frage ist, warum die Ansichtsgröße ändert? Was mache ich falsch?

+0

Ich bin mir nicht sicher, aber ich nehme an, dies liegt wahrscheinlich daran, dass Sie die 'Schicht' der Ansicht ändern und somit die Autolayout-Bedingungen beeinflussen. Wenn Sie nur die Ecken der Ansicht abrunden möchten, brauchen Sie 'CAShapeLayer' nicht zu verwenden. –

+0

Ich möchte nur abgerundete Ecken haben, deshalb ist es der Grund, warum ich CAShapeLayer verwende. –

Antwort

0

Sein, weil Ihr CAShapeLayer nicht automatisch Ändern der Größe, wenn die Kopfsicht der Einschränkungen der Größe verändert werden. Sie müssen den Pfad aktualisieren, wenn die Ansicht geändert wird:

let headerView: UIView! 

    override func awakeFromNib() { 
    super.awakeFromNib() 

    headerView = UIView(frame: bounds) 
    headerView.frame = bounds 

    headerView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 8).isActive = true 
    headerView.topAnchor.constraint(equalTo: self.topAnchor, constant: 4).isActive = true 
    headerView.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -8).isActive = true 
    headerView.heightAnchor.constraint(equalToConstant: 40).isActive = true 


    let rectShape = CAShapeLayer() 
    rectShape.bounds = headerView.layer.frame 
    rectShape.position = headerView.center 

    headerView.layer.backgroundColor = UIColor.green.cgColor 
    headerView.layer.mask = rectShape 
    } 

    override func layoutSubviews() { 
    super.layoutSubviews() 

    rectShape.path = UIBezierPath(roundedRect: headerView.layer.bounds, byRoundingCorners: [ .topLeft, .topRight], cornerRadii: CGSize(width: 10, height: 10)).cgPath 
    } 

benutzte ich awakeFromNib nur als Beispiel. Ihr Setup für Ihre Ansicht kann sich in Ihrer benutzerdefinierten UITableViewCell-Klasse unterscheiden.

+0

Danke! Das ist die richtige Antwort. Ich möchte nur hinzufügen, dass die Deklaration von rectShape außerhalb von watchFromNib liegen muss, sonst erhalten Sie einen Fehler in der layoutSubviews-Methode –

0

Wahrscheinlich erhalten Sie die HeaderView-Grenzen vor die Ansicht wird angepasst, um die Tabelle anzupassen.

Wenn dies in einer Unterklasse UIView, sollten Sie wahrscheinlich

override func layoutSubviews() { 
    // update path and mask here 
}