我想用圆圈掩盖一个正方形。我正在使用它代替角半径,因为我以后想做动画。
我可以让它掩盖,但边缘非常粗糙:
// Target View
let targetView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
targetView.backgroundColor = UIColor.redColor()
// Mask
let maskingPath = UIBezierPath()
let half = targetView.frame.width / 2
maskingPath.addArcWithCenter(CGPoint(x: half, y: half), radius: half, startAngle: 0, endAngle: 360, clockwise: true)
let maskingLayer = CAShapeLayer()
maskingLayer.path = maskingPath.CGPath
// Maybe setting contentsScale?
// maskingLayer.contentsScale = UIScreen.mainScreen().scale // doesn't change anything, sorry
// Maybe enabling edgeAntialiasing?
// maskingLayer.allowsEdgeAntialiasing = true // also doesn't change anything
// Magnification filter?
// maskingLayer.magnificationFilter = kCAFilterNearest // nuttin'
targetView.layer.mask = maskingLayer
我尝试了magnificationFilter和其他一些事情。
如何添加抗锯齿的可动画圆形遮罩?
答案 0 :(得分:4)
你给addArcWithCenter
一个角度:
maskingPath.addArcWithCenter(CGPoint(x: half, y: half),
radius: half,
startAngle: 0,
endAngle: 360,
clockwise: true)
但是the documentation表明角度应该是弧度。
因此,您需要多次创建一个与自身重叠的路径。边缘在先前的边缘通道的顶部绘制,在同一位置。在足够的传球建立后,他们最终看起来不透明(或几乎如此)。如果您在彼此之上创建多个圆形路径,您会看到类似的东西。
这对我来说效果更好:
maskingPath.addArcWithCenter(CGPoint(x: half, y: half),
radius: half,
startAngle: 0,
endAngle: CGFloat(M_PI * 2.0),
clockwise: true)
(但由于你真的想要一个封闭的椭圆形,你应该使用UIBezierPath(ovalInRect: targetView.bounds)
,就像你在答案中所做的那样。)
答案 1 :(得分:0)
找到解决方案,但不是根本原因。
这会画出脆弱的:
let maskingPath = UIBezierPath()
let half = targetView.frame.width / 2
maskingPath.addArcWithCenter(CGPoint(x: half, y: half), radius: half, startAngle: 0, endAngle: 360, clockwise: true)
let maskingLayer = CAShapeLayer()
maskingLayer.path = maskingPath.CGPath
targetView.layer.mask = maskingLayer
这将绘制出良好的抗锯齿效果:
let maskingLayer = CAShapeLayer()
maskingLayer.path = UIBezierPath(ovalInRect: targetView.bounds).CGPath
targetView.layer.mask = maskingLayer
希望我知道为什么。他们都将CGPath
用作图层蒙版。
编辑:Kurt指出我正在绘制360
弧度,这就像是一遍又一遍地绘制同一个圆圈,看起来不透明并破坏正在发生的任何抗锯齿。