【发布时间】:2020-06-25 10:27:17
【问题描述】:
我正在尝试实现一个允许向透明按钮添加阴影的功能。为此,我正在创建一个遮盖视图内阴影的图层。但是,我的阴影在左侧和上侧被剪裁,但在右侧和下侧没有被剪裁。
这是它的外观(这不是一个透明按钮,但它们也可以正常工作,除了像这样剪切阴影。):
这是我实现这一目标的代码:
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
}
}
}
我认为这与奇偶填充规则算法有关,我不确定。但是我怎样才能克服这个剪裁问题呢?
提前致谢。
编辑: 这是应用阴影时带有边框和文本的透明按钮的外观。我不想要。
它应该是这样的。内部没有阴影,但背景颜色也很清晰。 (除了剪裁的顶部和左侧):
【问题讨论】:
-
为什么不直接将阴影添加到按钮层而不是添加子层。
-
添加阴影的方法有很多种...你能用透明按钮显示你希望它的外观吗(使用你的“innerShadows”?
-
感谢您的回复。我更新了我的问题。 @kjoe 第一张图片展示了当您直接向透明层添加阴影时会发生什么。
-
@DonMag 后一张图片是我想要实现的,正如我之前所说的,唯一的问题是顶部和左侧的剪裁。不过,在这个例子中并不那么明显。但它在上面的红色按钮上可见。
标签: ios swift xcode core-graphics calayer