我正在尝试实现一种允许向透明按钮添加阴影的功能。为此,我正在创建一个遮罩视图内部阴影的层。但是,我的阴影在左侧和上部被剪切,但在右侧和下部没有被剪切。
这里是它的外观(这不是一个透明的按钮,但是除了像这样剪切阴影之外,它们也可以正常工作。):
这是实现此目的的代码:
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
}
}
}
我认为这与奇偶填充规则算法有关,我不确定。但是我该如何克服这种剪裁问题呢?
提前感谢。
尝试更改shadowOffset
shadowLayer.shadowOffset = shadowOffset ?? CGSize(width: -8, height: 0)