阴影不适用于带有蒙版的 UIViewLayer

Posted

技术标签:

【中文标题】阴影不适用于带有蒙版的 UIViewLayer【英文标题】:Shadow doesn't work with UIViewLayer with a mask 【发布时间】:2015-07-22 08:07:45 【问题描述】:

我已经使用 UIBezierPath 在左上角和右上角实现了一个带有圆角矩形的 UIView。但在那之后,当我向视图添加阴影时,它不会显示阴影。如果我只是删除贝塞尔圆角,那么阴影效果很好。但现在只有圆角出现,没有任何阴影。这是我的代码

override func drawRect(rect: CGRect)

    super.drawRect(rect)

    let shapeLayer : CAShapeLayer = CAShapeLayer(layer: centerView.layer)
    shapeLayer.path = UIBezierPath(roundedRect: centerView.layer.bounds, byRoundingCorners: UIRectCorner.TopRight|UIRectCorner.TopLeft, cornerRadii: CGSizeMake(15,15)).CGPath
    centerView.layer.mask = shapeLayer

    centerView.layer.masksToBounds = false

    centerView.layer.shadowOffset = CGSizeMake(0,-2)
    centerView.layer.shadowRadius = 0.5
    centerView.layer.shadowOpacity = 0.7
    centerView.layer.shadowColor = UIColor(red: 0.867, green: 0.867, blue: 0.867, alpha: 1).CGColor
    centerView.layer.shadowPath =  UIBezierPath(roundedRect: centerView.layer.bounds, byRoundingCorners: UIRectCorner.TopRight|UIRectCorner.TopLeft, cornerRadii: CGSizeMake(15,15)).CGPath

这里我覆盖了 UITableViewCell 的 drawRect 并且 centerView 是它的子视图。我也尝试将 UIView 子类化为 centerView,但这似乎也不起作用。

CALayer 的 mask 属性和 maskToBounds 属性是否相互冲突?

【问题讨论】:

你为什么在drawRect中这样做?你甚至没有使用rect 变量——这种东西应该在layoutSubviews 中完成。至少是布局。创建图层应该在初始设置期间完成 - 您不应该在每次绘制调用时都创建一个新图层。 好的。但这并不能解决问题。问题仍然存在 【参考方案1】:

将遮罩层应用于视图后,该视图将被剪切到遮罩层。视图的阴影也将被剪裁,因此不会被绘制。此问题的常见解决方案是拥有 2 个视图。一种视图用于投射阴影,另一种用于遮罩。 在您的情况下, centerView 是遮罩视图,因为您将遮罩层设置为 centerView 层。你需要做的是创建一个新的视图,我们称之为containerView。将centerView添加到containerView,并在容器视图上设置阴影,而不是centerView。

【讨论】:

这就是我所做的。感谢您的回复。

以上是关于阴影不适用于带有蒙版的 UIViewLayer的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有精确光栅蒙版的情况下光栅化形状?

Fabric JS 2.4.1 ClipPath Crop 不适用于动态创建的矩形蒙版

Keras `ImageDataGenerator` 图像和蒙版的增强方式不同

阴影不适用于文本视图。如何解决?

如何修复框阴影过渡不适用于悬停?

带有切出段和阴影的 UIView