屏蔽CAShapeLayer会创建这个奇怪的神器吗?

时间:2017-11-08 19:19:34

标签: ios swift calayer uibezierpath

我想为待办事项列表创建一个平滑的进度条。我使用了一个圆圈(CGMutablePath)来掩盖灰色区域,并且有一个明显的弧形神器。不仅如此,酒吧右侧还有一件神器。

注意:我试图对图层进行栅格化无济于事。

是什么原因导致iOS执行此操作以及如何解决此问题或将其删除?

private var circleMask: CAShapeLayer = CAShapeLayer()
override func layoutSubviews() {
    super.layoutSubviews()
    backgroundColor = GradientColor(.leftToRight, frame: self.bounds, colors: GradientFlatRed())
    layer.cornerRadius = bounds.height / 2
    plainProgressBar.layer.cornerRadius = layer.cornerRadius
    layer.shouldRasterize = true
    layer.rasterizationScale = UIScreen.main.scale

    plainProgressBar.layer.shouldRasterize = true
    plainProgressBar.layer.rasterizationScale = UIScreen.main.scale

    createMask()


}

private func createMask() {
    let path = CGMutablePath()
    path.addArc(center: CGPoint(x: bounds.origin.x+25/2, y: bounds.origin.y+25/2), radius: 25/2, startAngle: 0, endAngle: CGFloat(Double.pi*2), clockwise: false)
    path.addRect(bounds)
    circleMask.path = path
    circleMask.backgroundColor = plainMeterColor.cgColor
    circleMask.fillRule = kCAFillRuleEvenOdd
    plainProgressBar.layer.mask = circleMask
}

enter image description here

1 个答案:

答案 0 :(得分:2)

问题显然是抗锯齿边缘的组成错误。

Knee-jerk问题:您是否设置了非典型混合模式?

最简单的解决方案:不要使用moveaddLine(to:来生成两个完全不同的形状。只需使用addArc方法之一,将角半径设置为高度的一半,将总路径拉伸到左侧可用空间以创建硬边。

或者,如果没有显示,请手动构建路径为addLine(to:closeprivate func createMask() { let path = CGMutablePath() path.move(to: CGPoint(x: 0, y:0)) path.addLine(to: CGPoint(x: bounds.origin.x+25/2, y: 0)) path.addArc(center: CGPoint(x: bounds.origin.x+25/2, y: bounds.origin.y+25/2), radius: 25/2, startAngle: CGFloat(Double.pi/2.0), endAngle: CGFloat(Double.pi*3.0/2.0), clockwise: false) path.addLine(to: CGPoint(x: 0, y: 25)) path.close() ... 仅半圈,然后是最终{{1}}和一个{{1}}。例如。 (彻底未经测试,特别是:开始和结束角度以及顺时针与逆时针对比iOS的颠倒坐标系统)

{{1}}