在横向和纵向模式下向UIView添加投影

时间:2019-01-23 11:42:58

标签: iphone ipad screen-orientation ios-autolayout

我正在尝试向UIView添加阴影。这是我添加阴影的代码。

func addDropShadow() {
    layer.cornerRadius = 5.0
    layer.masksToBounds = false
    layer.shadowColor = UIColor.darkGray.cgColor
    layer.shadowOpacity = 0.5
    layer.shadowOffset = CGSize(width: 2, height: 2)
    layer.shadowRadius = 4

    layer.shadowPath = UIBezierPath(rect: bounds).cgPath
    layer.shouldRasterize = true
    layer.rasterizationScale = UIScreen.main.scale
}

如果设备处于纵向模式,效果很好,但是在横向模式下,阴影要么被剪掉

Portrait Image

当我再次将设备旋转到横向时,阴影路径移出了屏幕。

Portrait Image

我认为这可能是由于方向改变而导致的视角框架也得到了更新。因此,我在viewDidLayoutSubviews方法中更新了阴影路径属性。 但是行为保持不变。

这是我的代码

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.dropShadowView.layer.shadowPath = UIBezierPath(rect: self.dropShadowView.bounds).cgPath
}

我在这里做错什么了吗?

1 个答案:

答案 0 :(得分:1)

如果将阴影设为UIView的子类并覆盖layoutSubviews(),您会发现管理阴影要容易得多:

@IBDesignable
class SimpleShadowedView: UIView {

    override func layoutSubviews() {
        super.layoutSubviews()

        layer.cornerRadius = 5.0
        layer.masksToBounds = false
        layer.shadowColor = UIColor.darkGray.cgColor
        layer.shadowOpacity = 0.5
        layer.shadowOffset = CGSize(width: 2, height: 2)
        layer.shadowRadius = 4

        layer.shadowPath = UIBezierPath(rect: bounds).cgPath
        layer.shouldRasterize = true
        layer.rasterizationScale = UIScreen.main.scale

    }
}

还要注意,通过添加@IBDesignable名称,您还可以在设计时看到输出。

在“故事板/界面”构建器中将视图的“自定义类”设置为SimpleShadowedView

enter image description here

它将在运行时显示:

enter image description here

enter image description here

如果选择Editor -> Refresh All Views(或Automatically Refresh Views),则在设计时也会看到它。

enter image description here