Shadow不会使用蒙版与UIViewLayer一起使用

时间:2015-07-22 08:07:45

标签: ios swift calayer quartz-core dropshadow

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

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属性是否相互冲突?

1 个答案:

答案 0 :(得分:5)

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