阴影效果无法正确显示UIView

aqs*_*had 7 ios swift

我有一个登录屏幕如下.在每个文本字段周围,我添加了一个视图,对于该视图,我想显示一个投影.我有点实现了我的尝试,但这件事不适用于iPhone Plus(6 +,8 +)设备.

你可以看到下面的区别.

iPhone 8 +: -

在此输入图像描述

iPhone 8: -

在此输入图像描述

这是我的代码

extension UIView {
    func addShadow() {        
        layer.cornerRadius = 8
        layer.masksToBounds = true

        layer.shadowColor = UIColor.lightGray.cgColor
        layer.shadowOffset = CGSize(width: 0, height: 1.0)
        layer.shadowRadius = 2.0
        layer.shadowOpacity = 0.5
        layer.masksToBounds = false

        layer.shadowPath = UIBezierPath(roundedRect: self.bounds,cornerRadius:8).cgPath
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎么能正确解决这个问题?

cle*_*ens 5

由于视图可能会调整大小,因此您应该shadowPath在调整大小后更新您的视图,因为它具有固定大小。不幸的是,这不能在扩展中完成,因为您需要覆盖layoutSubview(). 但是,你可以调用addShadow()viewDidLayoutSubviews()您的视图控制器再次对每个文本字段。

您还可以修改您的扩展程序以仅更新路径:

extension UIView {
    func addShadow() {        
        layer.cornerRadius = 8

        layer.shadowColor = UIColor.lightGray.cgColor
        layer.shadowOffset = CGSize(width: 0, height: 1.0)
        layer.shadowRadius = 2.0
        layer.shadowOpacity = 0.5
        layer.masksToBounds = false

        updateShadow()
    }
    func updateShadow() {
        layer.shadowPath = UIBezierPath(roundedRect: self.bounds,cornerRadius:8).cgPath
    }  
}
Run Code Online (Sandbox Code Playgroud)

有了这个,你应该叫updateShadow()viewDidLayoutSubviews()与阴影每个视图。

如果您为文本字段使用自定义子类,则可以将updateShadow()调用放入layoutSubviews(). 所以你不需要从视图控制器调用它。