ios - UIView 的阴影效果显示不正确

标签 ios swift

我有一个登录屏幕,如下所示。我在每个文本字段周围添加了一个 View ,并且我想为该 View 显示一个投影。我有点实现了我的尝试,但这个东西不适用于 iPhone Plus (6+,8+) 设备。

您可以在下面看到不同之处。

iPhone 8+:-

enter image description here

iPhone 8:-

enter image description here

这是我的代码

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
    }
}

我该如何正确解决这个问题?

最佳答案

由于 View 可能会调整大小,因此您应该在调整大小后更新您的 shadowPath,因为它具有固定大小。不幸的是,这不能在扩展中完成,因为您需要覆盖 layoutSubview()。但是您可以从 View Controller 再次为每个文本字段从 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() 为每个带有阴影的 View 调用 updateShadow()

如果您为文本字段使用自定义子类,您可以将 updateShadow() 调用放入 layoutSubviews()。所以你不需要从 View Controller 调用它。

关于ios - UIView 的阴影效果显示不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49664951/

相关文章:

ios - 如何在 ViewDidLoad( ) 之外使用变量 - Swift

iOS:Tabbar - 加载选项卡的默认状态

ios - swift 3 图 : FILTER and CONTAINS for Entities

ios - NSLog 禁用某些类和 DEBUG

ios - 如何在 Swift 的闭包中调用 super

swift - 使用自动布局以编程方式设置 UITableViewCell 高度

ios - 如何以编程方式更新约束?

ios - 从 PHAsset 中提取元数据返回意外的 nil 值

ios - Swift 后台同步管理器

ios - 播放期间节点消失显示错误...Thread1 : EXC_BAD_ACCESS (code=, 地址= 0x0)