Как контролировать распространение и размытие теней?
Я разработал элементы пользовательского интерфейса в эскизе, и один из них имеет тень с размытием 1 и распространением 0. Я посмотрел на документ для свойства слоя views, и слой не имеет ничего с именем spread или blur или что-то эквивалентное (единственный элемент управления был просто shadowOpacity) как можно управлять такими вещами, как blur и spread?
EDIT:
вот мои настройки в эскиз :
И вот что я хочу, чтобы моя тень смотреть например:
И вот как это выглядит на данный момент:
обратите внимание, вы должны нажать на картинку, чтобы увидеть тень.
мой код выглядит следующим образом:
func setupLayer(){
view.layer.cornerRadius = 2
view.layer.shadowColor = Colors.Shadow.CGColor
view.layer.shadowOffset = CGSize(width: 0, height: 1)
view.layer.shadowOpacity = 0.9
view.layer.shadowRadius = 5
}
4 ответа:
вот как применить все 6 свойств тени эскиза к слою UIView с почти идеальной точностью:
extension CALayer { func applySketchShadow( color: UIColor = .black, alpha: Float = 0.5, x: CGFloat = 0, y: CGFloat = 2, blur: CGFloat = 4, spread: CGFloat = 0) { shadowColor = color.cgColor shadowOpacity = alpha shadowOffset = CGSize(width: x, height: y) shadowRadius = blur / 2.0 if spread == 0 { shadowPath = nil } else { let dx = -spread let rect = bounds.insetBy(dx: dx, dy: dx) shadowPath = UIBezierPath(rect: rect).cgPath } } }
скажем, мы хотим представить следующим образом:
вы можете легко сделать это с помощью:
myView.layer.applySketchShadow( color: .black, alpha: 0.5, x: 0, y: 0, blur: 4, spread: 0)
или более лаконично:
myView.layer.applySketchShadow(y: 0)
пример:
Слева: iphone 8 UIView скриншот; справа: эскиз прямоугольник.
Примечание:
- при использовании ненулевого
spread
, он жестко кодирует путь на основеbounds
из CALayer. Если границы слоя когда-либо изменятся, вы захотите вызватьapplySketchShadow()
опять способ.
вы можете попробовать это .... вы можете играть со значениями. Элемент
shadowRadius
определяет степень размытия.shadowOffset
диктует, куда идет тень.Swift 2.0
let radius: CGFloat = demoView.frame.width / 2.0 //change it to .height if you need spread for height let shadowPath = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 2.1 * radius, height: demoView.frame.height)) //Change 2.1 to amount of spread you need and for height replace the code for height demoView.layer.cornerRadius = 2 demoView.layer.shadowColor = UIColor.blackColor().CGColor demoView.layer.shadowOffset = CGSize(width: 0.5, height: 0.4) //Here you control x and y demoView.layer.shadowOpacity = 0.5 demoView.layer.shadowRadius = 5.0 //Here your control your blur demoView.layer.masksToBounds = false demoView.layer.shadowPath = shadowPath.CGPath
Swift 3.0
let radius: CGFloat = demoView.frame.width / 2.0 //change it to .height if you need spread for height let shadowPath = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 2.1 * radius, height: demoView.frame.height)) //Change 2.1 to amount of spread you need and for height replace the code for height demoView.layer.cornerRadius = 2 demoView.layer.shadowColor = UIColor.black.cgColor demoView.layer.shadowOffset = CGSize(width: 0.5, height: 0.4) //Here you control x and y demoView.layer.shadowOpacity = 0.5 demoView.layer.shadowRadius = 5.0 //Here your control your blur demoView.layer.masksToBounds = false demoView.layer.shadowPath = shadowPath.cgPath
пример со спредом
чтобы создать основную тень
demoView.layer.cornerRadius = 2 demoView.layer.shadowColor = UIColor.blackColor().CGColor demoView.layer.shadowOffset = CGSizeMake(0.5, 4.0); //Here your control your spread demoView.layer.shadowOpacity = 0.5 demoView.layer.shadowRadius = 5.0 //Here your control your blur
основной пример тени в Swift 2.0
этот код работал очень хорошо для меня:
yourView.layer.shadowOpacity = 0.2 // opacity, 20% yourView.layer.shadowColor = UIColor.black.cgColor yourView.layer.shadowRadius = 2 // HALF of blur yourView.layer.shadowOffset = CGSize(width: 0, height: 2) // Spread x, y yourView.layer.masksToBounds = false
мое решение на основе этого сообщения отвечает: (Swift 3)
let shadowPath = UIBezierPath(rect: CGRect(x: -1, y: -2, width: target.frame.width + 2, height: target.frame.height + 2)) target.layer.shadowColor = UIColor(hexString: shadowColor).cgColor target.layer.shadowOffset = CGSize(width: CGFloat(shadowOffsetX), height: CGFloat(shadowOffsetY)) target.layer.masksToBounds = false target.layer.shadowOpacity = Float(shadowOpacity) target.layer.shadowPath = shadowPath.cgPath