我有一个登录屏幕,如下所示.在每个文本字段周围,我添加了一个视图,对于该视图,我想显示一个投影.我有点实现了我的尝试,但这件事不适用于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 } }
我怎么能正确解决这个问题?
解决方法
由于视图可能会调整大小,因此您应该在调整大小后更新shadowPath,因为它具有固定大小.不幸的是,这不能在扩展中完成,因为您需要覆盖layoutSubview().但是,您可以再次从视图控制器中为每个文本字段调用viewDidLayoutSubviews()中的addShadow().
您也可以修改您的扩展程序以仅更新路径:
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 } }
有了这个,您应该从viewDidLayoutSubviews()为每个带阴影的视图调用updateShadow().
如果为文本字段使用自定义子类,则可以将updateShadow()调用放入layoutSubviews().所以你不需要从视图控制器调用它.