Trochę poprawy dla innych odpowiedzi, dzięki Ashok R dla kodu szybkiego.
Ponieważ tworzyliśmy widok trójkątny w tle widoku z cieniem ze wszystkich stron, a biały trójkąt na cieniach bocznych nie jest potrzebny.
Zrywa się w przypadku widoków o szerokości porównywalnie większej niż wysokość.
Rozwiązaniem będzie zmieniać ścieżkę do linii, w której nie jest potrzebne cień nieco ku tej stronie widzenia zamiast tworzenia trójkątną ścieżkę widok całkowicie.
Stworzyłem przedłużenie tego -
extension UIView {
func addshadow(top: Bool,
left: Bool,
bottom: Bool,
right: Bool,
shadowRadius: CGFloat = 2.0) {
self.layer.masksToBounds = false
self.layer.shadowOffset = CGSize(width: 0.0, height: 0.0)
self.layer.shadowRadius = shadowRadius
self.layer.shadowOpacity = 1.0
let path = UIBezierPath()
var x: CGFloat = 0
var y: CGFloat = 0
var viewWidth = self.frame.width
var viewHeight = self.frame.height
// here x, y, viewWidth, and viewHeight can be changed in
// order to play around with the shadow paths.
if (!top) {
y+=(shadowRadius+1)
}
if (!bottom) {
viewHeight-=(shadowRadius+1)
}
if (!left) {
x+=(shadowRadius+1)
}
if (!right) {
viewWidth-=(shadowRadius+1)
}
// selecting top most point
path.move(to: CGPoint(x: x, y: y))
// Move to the Bottom Left Corner, this will cover left edges
/*
|☐
*/
path.addLine(to: CGPoint(x: x, y: viewHeight))
// Move to the Bottom Right Corner, this will cover bottom edge
/*
☐
-
*/
path.addLine(to: CGPoint(x: viewWidth, y: viewHeight))
// Move to the Top Right Corner, this will cover right edge
/*
☐|
*/
path.addLine(to: CGPoint(x: viewWidth, y: y))
// Move back to the initial point, this will cover the top edge
/*
_
☐
*/
path.close()
self.layer.shadowPath = path.cgPath
}
i ustawić wartość logiczną prawdziwą dla której strony chcesz cień pojawiać
myView.addshadow(top: false, left: true, bottom: true, right: true, shadowRadius: 2.0)
// promień cień jest opcjonalny powyżej i jest ustawiony domyślnie na 2.0
lub myView.addshadow(top: true, left: true, bottom: true, right: true, shadowRadius: 2.0)
lub myView.addshadow(top: false, left: false, bottom: true, right: true, shadowRadius: 2.0)
to nie działa z większej 'shadowRadius' ponieważ może krwawić poza trójkątnym obszarze utworzonego z' shadowPath '. –
Prawda, można ustawić ścieżkę, aby była nieco krótsza niż reszta kwadratu w tych rzutach. –