【发布时间】:2020-04-02 14:18:07
【问题描述】:
我正在创建一个类似于右侧 here 上的 Android Material Design 加载指示器的圆圈,但该圆圈并未自行完成。
class ViewController: UIViewController {
var baseLayer = CAShapeLayer()
override func viewDidLoad() {
super.viewDidLoad()
setUp()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
animate()
}
private func setUp() {
view.layer.addSublayer(baseLayer)
let basePath = UIBezierPath(arcCenter: view.center,
radius: 100,
startAngle: CGFloat.pi / 2,
endAngle: 2 * CGFloat.pi,
clockwise: true).cgPath
baseLayer.strokeColor = UIColor.gray.cgColor
baseLayer.path = basePath
baseLayer.fillColor = UIColor.clear.cgColor
baseLayer.lineWidth = 2
baseLayer.position = view.center
baseLayer.strokeEnd = 0
}
private func animate() {
CATransaction.begin()
let strokeEndAnimation = CABasicAnimation(keyPath: "strokeEnd")
strokeEndAnimation.toValue = 1
strokeEndAnimation.fillMode = .forwards
strokeEndAnimation.isRemovedOnCompletion = false
strokeEndAnimation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation")
rotationAnimation.toValue = CGFloat.pi
rotationAnimation.fillMode = .forwards
rotationAnimation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
rotationAnimation.isRemovedOnCompletion = false
let group = CAAnimationGroup()
group.duration = 1.5
group.repeatCount = 0
group.fillMode = .forwards
group.isRemovedOnCompletion = false
group.animations = [strokeEndAnimation, rotationAnimation]
baseLayer.add(group, forKey: "animations")
CATransaction.commit()
}
}
下图显示了我在说什么。它正确地停在 3*pi/2 但我相信 strokeEnd 错误地停在 pi 处。我尝试了各种不同的 strokeEnd 和 transform 动画配置,但似乎没有任何效果。修改 strokeEnd toValue 动画不会改变任何东西。
【问题讨论】:
-
我对你想要的最终结果有点困惑......你想要画一个完整的圆圈并且让整个事物旋转为正在画吗?
-
如果你用全班更新你的问题(或者至少足够我们可以复制/粘贴并查看它),我们可以看看。只有部分代码很难提供帮助。
-
疑难解答:您是否尝试过从组中删除旋转动画以确保 strokeEnd 动画按您编写的那样工作?
-
@Grady - 试试
endAngle: 3 * CGFloat.pi(3 而不是 2)
标签: ios swift caanimation