【问题标题】:Stop CALayer shadow from affecting subviews?阻止 CALayer 阴影影响子视图?
【发布时间】:2015-09-19 03:11:51
【问题描述】:

我有一个自定义的UIControl,我希望它有一个阴影,所以我在它的layer 上设置了相关属性。根据需要在视图周围出现阴影,但在 UILabel 的文本下方也会出现阴影,这是一个子视图。你怎么阻止这个?我只想要外部超级视图周围的阴影。

...
init() {        
    label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    self.translatesAutoresizingMaskIntoConstraints = false
    addSubview(label)

    self.layer.masksToBounds = false
    self.layer.shadowColor = UIColor.blackColor().CGColor
    self.layer.shadowOpacity = 1.0
    self.layer.shadowRadius = 2.0

    // Adding these lines trying to explicitly stop shadow on label...
    label.layer.shadowOpacity = 0
    label.layer.shadowColor = nil
    ...
}

【问题讨论】:

  • 配置 self.layer 阴影后是否尝试为 label.layer 设置零阴影?
  • 是的,我做到了。我在有问题的代码中添加了几行代码。

标签: ios uiview ios8 calayer shadow


【解决方案1】:

当父视图的 alpha 小于 1.0 或没有背景颜色(即设置为清除颜色)时,会发生这种情况。在这种情况下,阴影会转化为子视图。请参阅我的回答 here 了解更多详情。

Apple Docs 证明这一点:

图 A-7 显示了同一示例层的几个不同版本 应用了红色阴影。左边和中间的版本包括一个 背景颜色,所以阴影只出现在边框的周围 层。但是,右边的版本不包括背景 颜色。在这种情况下,阴影将应用于图层的内容, 边框和子图层。

【讨论】:

  • 是的,外部视图的 alpha
  • 防止这种情况发生的解决方案是什么?
  • @KvnH 这取决于。如果您不需要(半)透明超层,只需将其 alpha 更改为 1。如果您确实需要一个(半)透明层“在”您的视图/层“后面”,只需创建另一个父层/视图并添加您的透明子视图/sublayer 以及所有其他视图。它应该可以工作。
  • 谢谢!你为我节省了很多时间。我一无所知
【解决方案2】:

只需更改您的子视图父级即可。

换句话说,在你的透明阴影视图之上创建新的父视图,并将子视图插入到这个新的父视图中。

【讨论】:

    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2013-10-01
    相关资源
    最近更新 更多