Schnell
![enter image description here]()
// corner radius
blueView.layer.cornerRadius = 10
// border
blueView.layer.borderWidth = 1.0
blueView.layer.borderColor = UIColor.black.cgColor
// shadow
blueView.layer.shadowColor = UIColor.black.cgColor
blueView.layer.shadowOffset = CGSize(width: 3, height: 3)
blueView.layer.shadowOpacity = 0.7
blueView.layer.shadowRadius = 4.0
Sondierung der Optionen
![enter image description here]()
![enter image description here]()
![enter image description here]()
![enter image description here]()
![enter image description here]()
Problem 1: Schatten wird abgeschnitten
Was ist, wenn es Unterebenen oder Unteransichten (wie ein Bild) gibt, deren Inhalt wir auf die Grenzen unserer Ansicht beschränken wollen?
![enter image description here]()
Wir können dies erreichen mit
blueView.layer.masksToBounds = true
(Alternativ dazu, blueView.clipsToBounds = true
gibt die dasselbe Ergebnis .)
![enter image description here]()
Aber, Oh nein! Der Schatten wurde auch abgeschnitten, weil er außerhalb der Grenzen liegt! Was ist zu tun? Was ist zu tun?
Lösung
Verwenden Sie separate Ansichten für den Schatten und den Rand. Die Basisansicht ist transparent und enthält den Schatten. Die Ansicht "Rand" klammert jeden anderen Unterinhalt, den sie hat, an ihren Rand.
// add the shadow to the base view
baseView.backgroundColor = UIColor.clear
baseView.layer.shadowColor = UIColor.black.cgColor
baseView.layer.shadowOffset = CGSize(width: 3, height: 3)
baseView.layer.shadowOpacity = 0.7
baseView.layer.shadowRadius = 4.0
// add the border to subview
let borderView = UIView()
borderView.frame = baseView.bounds
borderView.layer.cornerRadius = 10
borderView.layer.borderColor = UIColor.black.cgColor
borderView.layer.borderWidth = 1.0
borderView.layer.masksToBounds = true
baseView.addSubview(borderView)
// add any other subcontent that you want clipped
let otherSubContent = UIImageView()
otherSubContent.image = UIImage(named: "lion")
otherSubContent.frame = borderView.bounds
borderView.addSubview(otherSubContent)
Daraus ergibt sich das folgende Ergebnis:
![enter image description here]()
Problem 2: Schlechte Leistung
Das Hinzufügen von abgerundeten Ecken und Schatten kann ein Leistungsschub sein. Sie können die Leistung verbessern, indem Sie einen vordefinierten Pfad für den Schatten verwenden und außerdem angeben, dass er gerastert werden soll. Der folgende Code kann dem obigen Beispiel hinzugefügt werden.
baseView.layer.shadowPath = UIBezierPath(roundedRect: baseView.bounds, cornerRadius: 10).cgPath
baseView.layer.shouldRasterize = true
baseView.layer.rasterizationScale = UIScreen.main.scale
Voir diese Stelle für weitere Einzelheiten. Siehe aquí y aquí auch.
Diese Antwort wurde mit Swift 4 und Xcode 9 getestet.