【问题标题】:UIView Shadow using BezierPath massively offsets the shadowUIView Shadow 使用 BezierPath 大量抵消阴影
【发布时间】:2017-10-17 19:26:52
【问题描述】:

我在 UIView 中添加了阴影,但得到以下结果:

代码如下:

mainView.layer.cornerRadius = 8
mainView.layer.shadowColor = UIColor.black.cgColor
mainView.layer.shadowOpacity = 0.2
mainView.layer.shadowRadius = 10
mainView.clipsToBounds = false
mainView.backgroundColor = UIColor.blue
mainView.layer.shadowPath = UIBezierPath(roundedRect: mainView.frame, cornerRadius: 8).cgPath

鉴于我给 shadowPath 提供了与蓝色视图 (mainView) 完全相同的帧,我不明白为什么阴影会如此偏移。我知道我可以使用 shadowOffset 属性解决此问题,但我尝试使用 shadowPath 的全部原因是使用 shadowOffset,因为它可能存在一些大规模的性能问题。

更新:将 mainView.frame 修复为 mainView.bounds 后,阴影已适当对齐。但是,mainView 顶部的阴影似乎仍然略微偏移(上方阴影更强):

【问题讨论】:

  • 尝试将 mainView.frame 更改为 mainView.bounds

标签: ios swift uiview shadow


【解决方案1】:

注意阴影是在视图坐标中指定的,因此您应该使用mainView.bounds

mainView.layer.shadowPath = UIBezierPath(roundedRect: mainView.bounds, cornerRadius: 8).cgPath

换句话说,你想要一个以(0, 0)为原点的矩形,而不是mainView的位置。

【讨论】:

  • 没有意识到它是根据视图坐标指定的!谢谢。
  • 修复后,您知道为什么 UIView 上方的阴影可能比下方更强吗(用屏幕截图更新了我的原始问题)?我本来希望阴影分布均匀。
  • @pizza7 我唯一的想法是你的视图高度增加了。当大小改变时你是否更新阴影?例如。在layoutSubviews?
【解决方案2】:

主视图顶部的阴影似乎仍然略微偏移

这是因为shadowOffset 有一个默认值(0.0, -3.0)

https://developer.apple.com/documentation/quartzcore/calayer/1410970-shadowoffset

为避免这种情况,您可以使用offsetBy

mainView.layer.shadowPath = UIBezierPath(roundedRect: mainView.bounds.offsetBy(dx: 0.0, dy: 3.0), cornerRadius: 8).cgPath

或者简单地说,将.zero 传递给shadowOffset

mainView.layer.shadowOffset = .zero

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多