首页 > 解决方案 > UIView 阴影显示不正确

问题描述

我之前遇到过这个问题,通常可以通过将代码放入viewWillLayoutSubviews(). 这适用于我拥有的所有其他视图控制器,但我找不到解决方案。

我有一个UIView,我正在为它添加一个阴影,如下所示:

func setUpUI() {
        for tile in roundedTiles {
            tile.layer.cornerRadius = t.frame.height/2

            tile.layer.shadowColor = UIColor.black.cgColor
            tile.layer.shadowRadius = 10.0
            tile.layer.shadowOpacity = 0.15
            tile.layer.addSpread(spread: -10)

            tile.layer.borderColor = GlobalConstants.Colors.lightGray.cgColor
            tile.layer.borderWidth = 1
        }

    }

然后我在这里调用它:

override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        setUpUI()
    }

然而,这就是它的样子:

在此处输入图像描述

这是它应该看起来的样子,取自另一个正确显示的视图控制器(我在那里编写的代码完全相同):

在此处输入图像描述

在查看了其他 StackOverflow 问题后,我尝试将其移至viewDidLayoutSubviews()viewDidLoad()和添加tile.layoutIfNeeded()。没有任何工作。真的很感激一些帮助!

标签: swiftuiview

解决方案


首先,我建议为您的图块子类化 UIView 并在 init 方法中添加阴影和圆角,而不是通过父视图控制器添加它。

获得带有阴影的圆角的技巧是将阴影添加到视图本身,然后为圆角添加一个子视图,您可以在不影响父视图的情况下对其进行 maskToBounds。

所以:

class roundedTile: UIView {
    required init?(coder: NSCoder) {
        super.init(coder: coder)

        self.layer.cornerRadius = self.frame.height/2

        // Add shadow to parent view
        self.layer.shadowColor = UIColor.black.cgColor
        self.layer.shadowOffset = CGSize(width: 5.0, height: 0.0)
        self.layer.shadowOpacity = 0.15
        self.layer.shadowRadius = 10.0

        // Create subview for rounded corners
        let subView = UIView()
        subView.frame.size = self.frame.size

        subView.layer.cornerRadius = frame.height/2
        subView.layer.borderColor = UIColor.lightGray.cgColor
        subView.layer.borderWidth = 1
        subView.layer.masksToBounds = true

        self.addSubview(subView)
    }
}

品尝阴影偏移/半径/不透明度的季节。


推荐阅读