我正在尝试实现一项功能,允许向透明按钮添加阴影。为此,我正在创建一个图层来遮挡视图内的阴影。然而,我的阴影在左侧和上方被剪切,但在右侧和下方未被剪切。
以下是它的外观(这不是透明按钮,但它们也正常工作,除了阴影像这样被剪切之外)。
我认为这与偶奇填充规则算法有关,但我不确定。但是我该如何克服这个剪切问题呢?
提前感谢您。
编辑:这是一个透明按钮,带有边框和文本,当应用阴影时它看起来是这样的..这不是我想要的。 它应该看起来像这样。没有阴影,但也具有清晰的背景色。(除了剪裁的顶部和左侧):
以下是它的外观(这不是透明按钮,但它们也正常工作,除了阴影像这样被剪切之外)。
这是我实现它的代码:
private func applyShadow() {
layer.masksToBounds = false
if shouldApplyShadow && shadowLayer == nil {
shadowLayer = CAShapeLayer()
let shapePath = CGPath(roundedRect: bounds, cornerWidth: cornerRadi, cornerHeight: cornerRadi, transform: nil)
shadowLayer.path = shapePath
shadowLayer.fillColor = backgroundColor?.cgColor
shadowLayer.shadowPath = shadowLayer.path
shadowLayer.shadowRadius = shadowRadius ?? 8
shadowLayer.shadowColor = (shadowColor ?? .black).cgColor
shadowLayer.shadowOffset = shadowOffset ?? CGSize(width: 0, height: 0)
shadowLayer.shadowOpacity = shadowOpacity ?? 0.8
layer.insertSublayer(shadowLayer!, at: 0)
/// If there's background color, there is no need to mask inner shadows.
if backgroundColor != .none && !(innerShadows ?? false) {
let maskLayer = CAShapeLayer()
maskLayer.path = { () -> UIBezierPath in
let path = UIBezierPath()
path.append(UIBezierPath(cgPath: shapePath))
path.append(UIBezierPath(rect: UIScreen.main.bounds))
path.usesEvenOddFillRule = true
return path
}().cgPath
maskLayer.fillRule = .evenOdd
shadowLayer.mask = maskLayer
}
}
}
我认为这与偶奇填充规则算法有关,但我不确定。但是我该如何克服这个剪切问题呢?
提前感谢您。
编辑:这是一个透明按钮,带有边框和文本,当应用阴影时它看起来是这样的..这不是我想要的。 它应该看起来像这样。没有阴影,但也具有清晰的背景色。(除了剪裁的顶部和左侧):