Schnell
// 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
Erkundung der Optionen
Problem 1: Der Schatten wird abgeschnitten
Was ist, wenn es Unterschichten oder Unteransichten (wie ein Bild) gibt, deren Inhalt wir an die Grenzen unserer Ansicht kürzen möchten?
Wir können dies mit erreichen
blueView.layer.masksToBounds = true
(Alternativ blueView.clipsToBounds = true
ergibt sich das gleiche Ergebnis .)
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 hat den Schatten. In der Rahmenansicht werden alle anderen Unterinhalte, die an den Rändern vorhanden sind, abgeschnitten.
// 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)
Dies ergibt das folgende Ergebnis:
Problem 2: Schlechte Leistung
Das Hinzufügen abgerundeter Ecken und Schatten kann ein Leistungseinbruch sein. Sie können die Leistung verbessern, indem Sie einen vordefinierten Pfad für den Schatten verwenden und 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
Weitere Informationen finden Sie in diesem Beitrag . Siehe hier und hier auch.
Diese Antwort wurde mit Swift 4 und Xcode 9 getestet.