阴影不适用于带有蒙版的 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 不适用于动态创建的矩形蒙版