【问题标题】:UIView shadow displaying incorrectlyUIView 阴影显示不正确
【发布时间】:2019-10-02 13:09:41
【问题描述】:

我以前遇到过这个问题,通常可以通过将代码放在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()。没有任何工作。真的很感激一些帮助!

【问题讨论】:

  • layer.addSpread 是自定义/扩展函数吗?
  • @Alexander Custom,尽管我删除了问题仍然存在
  • 这些视图是在 .xib 还是情节提要中绘制的?
  • @summerfinn3 故事板
  • 不要把它放在viewWillLayoutSubviews(),因为它可能在视图的生命周期中被多次调用。看起来你有一些累积的变化,每次调用方法时,这些变化开始累加。此外,这在您不需要每次都重置阴影属性的意义上是低效的;该层可以很好地记住它们。

标签: swift uiview


【解决方案1】:

首先,我建议为您的图块子类化 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)
    }
}

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

【讨论】:

  • 这实际上适用于阴影!但是,现在我遇到了它周围的角落和阴影的问题! :D imgur.com/a/AQv0TqB
  • 更新了我的解决方案以涉及一个单独的阴影层。角落和阴影不能很好地结合在一起。
  • 它确实适用于阴影和圆角,但它填充了黑色! imgur.com/a/I5tUNF4希望圆角+阴影更简单
  • 你从这里获取最新的吗?我测试了它并且它有效。不填充黑色。
  • 您必须将子视图的背景颜色设置为您想要的颜色
猜你喜欢
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 2012-05-10
相关资源
最近更新 更多