iOS10 UIView带阴影的模糊效果

时间:2016-09-15 14:22:27

标签: ios swift ios10

如何使用阴影对UIView产生模糊效果?如果我这样做:

    override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    let layer = self.view.layer;
    layer.shadowColor = UIColor.black.cgColor
    layer.shadowOpacity = 1.0
    layer.shadowOffset = CGSize(width: 0.0, height: 0.5)
    layer.shadowRadius = 5.0

    self.view.backgroundColor = UIColor.clear

    let blurEffect = UIBlurEffect(style: .light)
    let sideEffectView = UIVisualEffectView(effect: blurEffect)
    sideEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    sideEffectView.frame = self.view.bounds;
    self.view.addSubview(sideEffectView)
}

有阴影但没有模糊效果,如果我这样做:

    override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    self.view.backgroundColor = UIColor.clear

    let blurEffect = UIBlurEffect(style: .light)
    let sideEffectView = UIVisualEffectView(effect: blurEffect)
    sideEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    sideEffectView.frame = self.view.bounds;
    self.view.addSubview(sideEffectView)
}

有模糊效果,但没有阴影。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

谢谢你的回答。我还找到了另一个解决方案和你一起,它不是真正的影子(没有半径......):

    override func viewDidLoad() {
    super.viewDidLoad()

    self.view.backgroundColor = UIColor.clear

    let blurEffect = UIBlurEffect(style: .light)
    let sideEffectView = UIVisualEffectView(effect: blurEffect)
    sideEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    sideEffectView.frame = self.view.bounds
    self.view.addSubview(sideEffectView)

    let shadowView = UIView(frame: CGRect(x: 0.0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height))
    shadowView.translatesAutoresizingMaskIntoConstraints = false
    shadowView.backgroundColor = UIColor.white
    shadowView.layer.masksToBounds = false
    shadowView.layer.shadowOffset = CGSize(width: 2.5, height: 2.5)
    shadowView.layer.shadowOpacity = 1.0
    shadowView.layer.shadowRadius = 2.5

    self.view.insertSubview(shadowView, at: 0)

    // Set constraints programmatically, as this view is animatable
    NSLayoutConstraint(item: shadowView, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.trailingMargin, multiplier: 1.0, constant: 0.0).isActive = true
    NSLayoutConstraint(item: shadowView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.topMargin, multiplier: 1.0, constant: 0.0).isActive = true
    NSLayoutConstraint(item: shadowView, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.bottomMargin, multiplier: 1.0, constant: 0.0).isActive = true
    NSLayoutConstraint(item: shadowView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1.0, constant: 5.0).isActive = true
}

Blur effect with shadow

答案 1 :(得分:1)

我偶然发现了和你一样的问题。无法添加带有阴影的layer,因此需要向UIView UIVisualEffectsView添加额外的contentView,以达到相同的目的:

let borderViewFrame = CGRect(x: 0, y: bounds.maxY, width: bounds.width, height: 0.5)
let borderView = UIView(frame: borderViewFrame)
borderView.backgroundColor = UIColor.black.withAlphaComponent(0.25)
contentView.clipsToBounds = false
contentView.addSubview(borderView)