iOS CALayer mask奇怪的半像素线
iOS CALayer mask strange half pixel line
我需要通过所有文本层从 0 到 pi 切割透明弧。
除了一件事,上面给出的代码工作正常。
我在执行用于屏蔽 CALayer 的 CABasicAnimation 时有细线,并且在空闲状态下没有奇怪的线。
half pixel line image
不明白为什么要显示它,因为理论上它根本不需要显示...
这是我的游乐场代码:
import UIKit
import PlaygroundSupport
let rootView = UIView(frame: CGRect(x: 0, y: 0,
width: 200,
height: 200))
rootView.backgroundColor = .gray
let uiview = UIButton(frame: CGRect(x: 0,
y: 0,
width: 200,
height: 200))
uiview.setTitle("H", for: .normal)
uiview.titleLabel?.font = UIFont.boldSystemFont(ofSize: 200)
uiview.setTitleColor(.black, for: .normal)
uiview.backgroundColor = UIColor.green
uiview.layer.cornerRadius = 100
uiview.layer.masksToBounds = true
rootView.addSubview(uiview)
let center = CGPoint(x: uiview.bounds.width / 2,
y: uiview.bounds.height / 2)
let path = UIBezierPath(arcCenter: center,
radius: 80,
startAngle: 0,
endAngle: .pi,
clockwise: true)
path.append(UIBezierPath(arcCenter: center,
radius: 78,
startAngle: -1,
endAngle: .pi,
clockwise: true))
path.append(UIBezierPath(rect: uiview.bounds))
let maskLayer = CAShapeLayer()
maskLayer.frame = uiview.bounds
maskLayer.path = path.cgPath
maskLayer.backgroundColor = UIColor.clear.cgColor
maskLayer.fillRule = kCAFillRuleEvenOdd
maskLayer.lineWidth = 0
uiview.layer.mask = maskLayer
let rotation = CABasicAnimation(keyPath: "transform.rotation")
rotation.fromValue = 0.0
rotation.toValue = Double.pi * 2
rotation.duration = 10
rotation.repeatCount = 2
maskLayer.add(rotation, forKey: nil)
PlaygroundPage.current.liveView = rootView
我该如何解决这个问题?
有一些小改动,例如:
path.append(UIBezierPath(arcCenter: center,
radius: 78,
startAngle: .pi,
endAngle: 0,
clockwise: false))
动画的最后几秒是这样的:
两条弧线没有对齐。
所以发生了什么变化:
第二条弧的起始角为PI
它的结束角度为 0
顺时针设置为false
这就是你要找的吗?
我需要通过所有文本层从 0 到 pi 切割透明弧。 除了一件事,上面给出的代码工作正常。 我在执行用于屏蔽 CALayer 的 CABasicAnimation 时有细线,并且在空闲状态下没有奇怪的线。
half pixel line image
不明白为什么要显示它,因为理论上它根本不需要显示...
这是我的游乐场代码:
import UIKit
import PlaygroundSupport
let rootView = UIView(frame: CGRect(x: 0, y: 0,
width: 200,
height: 200))
rootView.backgroundColor = .gray
let uiview = UIButton(frame: CGRect(x: 0,
y: 0,
width: 200,
height: 200))
uiview.setTitle("H", for: .normal)
uiview.titleLabel?.font = UIFont.boldSystemFont(ofSize: 200)
uiview.setTitleColor(.black, for: .normal)
uiview.backgroundColor = UIColor.green
uiview.layer.cornerRadius = 100
uiview.layer.masksToBounds = true
rootView.addSubview(uiview)
let center = CGPoint(x: uiview.bounds.width / 2,
y: uiview.bounds.height / 2)
let path = UIBezierPath(arcCenter: center,
radius: 80,
startAngle: 0,
endAngle: .pi,
clockwise: true)
path.append(UIBezierPath(arcCenter: center,
radius: 78,
startAngle: -1,
endAngle: .pi,
clockwise: true))
path.append(UIBezierPath(rect: uiview.bounds))
let maskLayer = CAShapeLayer()
maskLayer.frame = uiview.bounds
maskLayer.path = path.cgPath
maskLayer.backgroundColor = UIColor.clear.cgColor
maskLayer.fillRule = kCAFillRuleEvenOdd
maskLayer.lineWidth = 0
uiview.layer.mask = maskLayer
let rotation = CABasicAnimation(keyPath: "transform.rotation")
rotation.fromValue = 0.0
rotation.toValue = Double.pi * 2
rotation.duration = 10
rotation.repeatCount = 2
maskLayer.add(rotation, forKey: nil)
PlaygroundPage.current.liveView = rootView
我该如何解决这个问题?
有一些小改动,例如:
path.append(UIBezierPath(arcCenter: center,
radius: 78,
startAngle: .pi,
endAngle: 0,
clockwise: false))
动画的最后几秒是这样的:
两条弧线没有对齐。
所以发生了什么变化:
第二条弧的起始角为PI
它的结束角度为 0
顺时针设置为false
这就是你要找的吗?