Добавьте Shadow на UIView, используя swift 3
before swift 3 Я добавлял тень в свой UIView следующим образом:
//toolbar is an UIToolbar (UIView)
toolbar.layer.masksToBounds = false
toolbar.layer.shadowOffset = CGSize(width: -1, height: 1)
toolbar.layer.shadowRadius = 1
toolbar.layer.shadowOpacity = 0.5
но приведенный выше код не работает в swift 3, вместо тени весь мой цвет View превращен в уродливый серый
Кто-нибудь знает, как добавить тень в быстрый 3?
Ответы
Ответ 1
КОД СНИПЕТТ:
extension UIView {
// OUTPUT 1
func dropShadow(scale: Bool = true) {
layer.masksToBounds = false
layer.shadowColor = UIColor.black.cgColor
layer.shadowOpacity = 0.5
layer.shadowOffset = CGSize(width: -1, height: 1)
layer.shadowRadius = 1
layer.shadowPath = UIBezierPath(rect: bounds).cgPath
layer.shouldRasterize = true
layer.rasterizationScale = scale ? UIScreen.main.scale : 1
}
// OUTPUT 2
func dropShadow(color: UIColor, opacity: Float = 0.5, offSet: CGSize, radius: CGFloat = 1, scale: Bool = true) {
layer.masksToBounds = false
layer.shadowColor = color.cgColor
layer.shadowOpacity = opacity
layer.shadowOffset = offSet
layer.shadowRadius = radius
layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
layer.shouldRasterize = true
layer.rasterizationScale = scale ? UIScreen.main.scale : 1
}
}
ПРИМЕЧАНИЕ. Если вы не передадите какой-либо параметр этой функции, то аргумент scale по умолчанию будет иметь значение true. Вы можете определить значение по умолчанию для любого параметра в функции, назначив значение параметру после этого типа параметров. Если определено значение по умолчанию, вы можете опустить этот параметр при вызове функции.
ВЫХОД 1:
shadowView.dropShadow()
![enter image description here]()
ВЫХОД 2:
shadowView.dropShadow(color: .red, opacity: 1, offSet: CGSize(width: -1, height: 1), radius: 3, scale: true)
![enter image description here]()
layer.shouldRasterize = true
сделает тень статичной и вызовет тень для начального состояния UIView
. Поэтому я бы рекомендовал не использовать layer.shouldRasterize = true
в динамических макетах, таких как view внутри UITableViewCell
.
Ответ 2
Shadow с использованием UIView Extension Swift 4
Я хотел бы добавить еще одну строку с выбранным ответом! Когда мы растеризуем слой, он должен быть установлен на 2.0 для дисплеев сетчатки. В противном случае текст метки или изображения на этом экране будут размытыми. Поэтому нам нужно добавить rasterizationScale
.
extension UIView {
func dropShadow() {
self.layer.masksToBounds = false
self.layer.shadowColor = UIColor.black.cgColor
self.layer.shadowOpacity = 0.5
self.layer.shadowOffset = CGSize(width: -1, height: 1)
self.layer.shadowRadius = 1
self.layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
self.layer.shouldRasterize = true
self.layer.rasterizationScale = UIScreen.main.scale
}
}
Ответ 3
Очень простой и несколько строк кода:
let viewShadow = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
viewShadow.center = self.view.center
viewShadow.backgroundColor = UIColor.yellow
viewShadow.layer.shadowColor = UIColor.red.cgColor
viewShadow.layer.shadowOpacity = 1
viewShadow.layer.shadowOffset = CGSize.zero
viewShadow.layer.shadowRadius = 5
self.view.addSubview(viewShadow)
Выглядит как: ![enter image description here]()
Ответ 4
Это работает для меня (Swift 3 и 4)
yourView.layer.shadowColor = UIColor.gray.cgColor
yourView.layer.shadowOpacity = 0.3
yourView.layer.shadowOffset = CGSize.zero
yourView.layer.shadowRadius = 6
Ответ 5
Хотя принятый ответ offSet: CGSize
и работает как надо, я изменил его так, чтобы он разделялся с offSet: CGSize
на offsetX: CGFloat
и offsetY: CGFloat
.
extension UIView {
func dropShadow(offsetX: CGFloat, offsetY: CGFloat, color: UIColor, opacity: Float, radius: CGFloat, scale: Bool = true) {
layer.masksToBounds = false
layer.shadowOffset = CGSize(width: offsetX, height: offsetY)
layer.shadowColor = color.cgColor
layer.shadowOpacity = opacity
layer.shadowRadius = radius
layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
layer.shouldRasterize = true
layer.rasterizationScale = scale ? UIScreen.main.scale : 1
}
}
Ответ 6
Если вам нужна округлая тень. Работает на swift 4.2
extension UIView {
func dropShadow() {
var shadowLayer: CAShapeLayer!
let cornerRadius: CGFloat = 16.0
let fillColor: UIColor = .white
if shadowLayer == nil {
shadowLayer = CAShapeLayer()
shadowLayer.path = UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius).cgPath
shadowLayer.fillColor = fillColor.cgColor
shadowLayer.shadowColor = UIColor.black.cgColor
shadowLayer.shadowPath = shadowLayer.path
shadowLayer.shadowOffset = CGSize(width: -2.0, height: 2.0)
shadowLayer.shadowOpacity = 0.8
shadowLayer.shadowRadius = 2
layer.insertSublayer(shadowLayer, at: 0)
}
}
}
Swift 4 округлый UIView с тенью
Ответ 7
Пожалуйста, попробуйте это
func applyShadowOnView(_ view: UIView) {
view.layer.cornerRadius = 8
view.layer.shadowColor = UIColor.darkGray.cgColor
view.layer.shadowOpacity = 1
view.layer.shadowOffset = .zero
view.layer.shadowRadius = 5
}
Ответ 8
loginView.layer.shadowOpacity = 1.0
Ответ 9
Swift 4
toolbar.layer.shadowColor = UIColor.hex(hexColor: "#000000", withAlpha: 1.0).cgColor
toolbar.layer.shadowOffset = CGSize.zero
toolbar.layer.shadowRadius = 1
toolbar.layer.shadowOpacity = 1
toolbar.layer.shouldRasterize = true
toolbar.layer.masksToBounds = false
Ответ 10
Если вы хотите использовать его как свойство IBInspectable для ваших представлений, вы можете добавить это расширение
import UIKit
extension UIView {
private static var _addShadow:Bool = false
@IBInspectable var addShadow:Bool {
get {
return UIView._addShadow
}
set(newValue) {
if(newValue == true){
layer.masksToBounds = false
layer.shadowColor = UIColor.black.cgColor
layer.shadowOpacity = 0.075
layer.shadowOffset = CGSize(width: 0, height: -3)
layer.shadowRadius = 1
layer.shadowPath = UIBezierPath(rect: bounds).cgPath
layer.shouldRasterize = true
layer.rasterizationScale = UIScreen.main.scale
}
}
}
}
Ответ 11
Мы можем применить тень, следуя также
cell.view1.layer.masksToBounds = false
cell.view1.layer.shadowColor = UIColor.lightGray.cgColor
cell.view1.backgroundColor = UIColor.white
cell.view1.layer.shadowOffset = CGSize(width: 1.0, height: 1.0)
cell.view1.layer.shadowOpacity = 0.5
Результат будет: http://prntscr.com/nhhv2s
Ответ 12
Пожалуйста, попробуйте это, это работает для меня.
extension UIView {
func dropShadow() {
layer.shadowColor = UIColor.black.cgColor
layer.shadowOffset = CGSize(width: 2, height: 3)
layer.masksToBounds = false
layer.shadowOpacity = 0.3
layer.shadowRadius = 3
//layer.shadowPath = UIBezierPath(rect: bounds).cgPath
layer.rasterizationScale = UIScreen.main.scale
layer.shouldRasterize = true
}}
Ответ 13
Swift 5 Просто вызовите эту функцию и передайте свой взгляд
public func setViewSettingWithBgShade(view: UIView)
{
view.layer.cornerRadius = 8
view.layer.borderWidth = 1
view.layer.borderColor = AppTextFieldBorderColor.cgColor
//MARK:- Shade a view
view.layer.shadowOpacity = 0.5
view.layer.shadowOffset = CGSize(width: 1.0, height: 1.0)
view.layer.shadowRadius = 3.0
view.layer.shadowColor = UIColor.black.cgColor
view.layer.masksToBounds = false
}
Ответ 14
Очень простое в использовании расширение для UIView, редактируемое прямо из раскадровки. Свифт 4+
@IBDesignable extension UIView {
@IBInspectable var shadowColor: UIColor?{
set {
guard let uiColor = newValue else { return }
layer.shadowColor = uiColor.cgColor
}
get{
guard let color = layer.shadowColor else { return nil }
return UIColor(cgColor: color)
}
}
@IBInspectable var shadowOpacity: Float{
set {
layer.shadowOpacity = newValue
}
get{
return layer.shadowOpacity
}
}
@IBInspectable var shadowOffset: CGSize{
set {
layer.shadowOffset = newValue
}
get{
return layer.shadowOffset
}
}
@IBInspectable var shadowRadius: CGFloat{
set {
layer.shadowRadius = newValue
}
get{
return layer.shadowRadius
}
}
}
Ответ 15
Применяет тень к представлению
func applyShadowOnView(_ view:UIView) {
view.layer.cornerRadius = 8
view.layer.shadowColor = UIColor.darkGray.cgColor
view.layer.shadowOpacity = 1
view.layer.shadowOffset = CGSize.zero
view.layer.shadowRadius = 5
}