基于路径的掩码,具有良好的抗锯齿功能

时间:2016-05-07 18:41:26

标签: ios calayer

我想用圆圈掩盖一个正方形。我正在使用它代替角半径,因为我以后想做动画。

我可以让它掩盖,但边缘非常粗糙:

enter image description here

  // 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和其他一些事情。

如何添加抗锯齿的可动画圆形遮罩?

2 个答案:

答案 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弧度,这就像是一遍又一遍地绘制同一个圆圈,看起来不透明并破坏正在发生的任何抗锯齿。