【发布时间】:2017-11-10 14:51:40
【问题描述】:
我正在使用以下代码来生成这个(在 drawRect 内):
let path = CGMutablePath()
path.addArc(center: self.circleCenter, radius: radius, startAngle: 0.0, endAngle: 2 * 3.14, clockwise: false)
let whitePath = UIBezierPath(cgPath: path)
UIColor.white.setStroke()
whitePath.lineWidth = 3
whitePath.stroke()
path.addRect(CGRect(x: 0, y: 0, width: frame.width, height: frame.height))
let maskLayer = CAShapeLayer()
maskLayer.backgroundColor = UIColor.black.cgColor
maskLayer.path = path
maskLayer.fillRule = kCAFillRuleEvenOdd
layer.mask = maskLayer
但是,我想把圆圈的顶部变白,这样整个圆圈里面都是白色的,但我不确定该怎么做,因为我已经将我的layer.mask 设置为CAShape 层,所以我在这个圆圈内所做的任何绘图都不会显示出来。
遮罩需要是一个圆圈,因为实际上对于我的大多数用例来说,对于这个自定义的 UIView,它不会剪辑另一个视图的顶部,所以使用一个圆圈效果很好。如何在圆圈的顶部区域绘制?
编辑:我希望这部分(我用红色圈起来的地方)被填充为白色:
所以我希望最终图像看起来像(抱歉质量不好,在我的 iPad 上手动绘制):
【问题讨论】:
-
一般来说,在
drawRect中操作图层是不可取的,因为它在渲染周期中发生得太晚了。如果要添加蒙版,请在layoutSubviews中进行。 -
完全不相关,而不是输入
3.14,我建议使用.pi。另外,我不确定您为什么要创建CGMutablePath而不是直接创建UIBezierPath。 -
对不起,我的措辞可能令人困惑。我已经返回并添加了其他照片以准确显示我想要的内容。我正在使用 CGPath,因为 layer.mask 采用 CGPath,而不是 UIBezierPath。
-
是的,“消息”来自下方的视图。暗影视图是顶部的 UIView,我在暗影视图中有一个蒙版,所以我可以看到它下面。据我所知,如果你想在 UIView 中“切一个洞”,就像我正在做的那样,你需要使用遮罩(除非有另一种我不知道的方法)
标签: ios core-graphics