使用swift 3在UIView上添加Shadow

rem*_*oys 61 ios swift3

之前的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
Run Code Online (Sandbox Code Playgroud)

但上面的代码不能在swift 3中工作,而不是阴影我的整个View的颜色变成了丑陋的灰色

谁知道我们如何在swift 3中添加阴影?

aas*_*sya 171

代码链:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:如果未将任何参数传递给该函数,则默认情况下scale参数将为true.您可以通过在该参数的类型之后为参数赋值来为函数中的任何参数定义默认值.如果定义了默认值,则可以在调用函数时省略该参数.

输出1:

shadowView.dropShadow()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

输出2:

shadowView.dropShadow(color: .red, opacity: 1, offSet: CGSize(width: -1, height: 1), radius: 3, scale: true)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

layer.shouldRasterize = true会使阴影保持静止并导致阴影的初始状态UIView.所以我建议不要layer.shouldRasterize = true在动态布局中使用,比如在视图里面UITableViewCell.

  • @SuhasPatil如果你想删除阴影那么,为什么要在第一时间添加它?你能详细说明你的情景,以便我能给你一个解决方案吗? (4认同)

Vin*_*ose 40

我想添加一行选定的答案!当我们栅格化图层时,需要将视网膜显示设置为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

    }
}
Run Code Online (Sandbox Code Playgroud)


Mr.*_*ani 36

非常简单且几行代码:

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)
Run Code Online (Sandbox Code Playgroud)

看起来像 : 在此输入图像描述

  • @ShivamPokhriyal maskToBounds 默认为 false。 (2认同)

Chh*_*eng 15

这对我有用(Swift 3和4)

yourView.layer.shadowColor = UIColor.gray.cgColor
yourView.layer.shadowOpacity = 0.3
yourView.layer.shadowOffset = CGSize.zero
yourView.layer.shadowRadius = 6
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!如果您更改第三行,如下所示.对于第一次尝试的人来说,阴影更明显.yourView.layer.shadowOffset = CGSize(宽度:2,高度:2) (3认同)

Sha*_*med 7

Swift 5 只需调用此函数并传递您的视图

public func setViewSettingWithBgShade(view: UIView)
{
    view.layer.cornerRadius = 8
    view.layer.borderWidth = 1
    view.layer.borderColor = UIColor.red.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
}
Run Code Online (Sandbox Code Playgroud)


bud*_*ino 6

尽管接受的答案很好并且可以正常工作,但我已将其修改为拆分offSet: CGSizeoffsetX: CGFloatoffsetY: 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
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

非常易于使用的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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)