【发布时间】:2021-05-08 19:07:18
【问题描述】:
我正在尝试将CABasicAnimation 用于自定义对象的计时功能(不是UIView)。
我正在尝试从here 实现@CIFilter 的答案,即使用CALayer 的动画表示层来评估计时功能。
我在viewDidAppear 中做这一切,所以存在一个有效的视图,但无论我做什么,Presentation 层总是为零。
请注意,我必须将动画添加到视图的图层,而不是我添加到其中的图层才能让它产生动画。如果我取消注释下面注释掉的行,我可以看到动画有效(但仅在为根层设置动画时)。不管怎样,Presentation 层是 nil。
我已经查看了几十个教程和 SO 答案,看来这应该可以正常工作,所以我想我一定是在做一些愚蠢的事情。
我只是想使用CoreAnimation 计时功能。我有UICubicTimingParameters 工作,但似乎走CA 路线提供更多功能,这会很好。
import UIKit
class ViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let newView = UIView(frame: view.frame)
view.addSubview(newView)
let evaluatorLayer = CALayer()
evaluatorLayer.frame = CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0)
evaluatorLayer.borderWidth = 8.0
evaluatorLayer.borderColor = UIColor.purple.cgColor
evaluatorLayer.timeOffset = 0.3
evaluatorLayer.isHidden = true
// evaluatorLayer.isHidden = false
newView.layer.addSublayer(evaluatorLayer)
let basicAnimation = CABasicAnimation(keyPath: "bounds.origin.x")
basicAnimation.duration = 1.0
basicAnimation.fromValue = 0.0
basicAnimation.toValue = 100.0
basicAnimation.fillMode = .forwards
basicAnimation.isRemovedOnCompletion = false
basicAnimation.speed = 0.0
// basicAnimation.speed = 0.1
newView.layer.add(basicAnimation, forKey: "evaluate")
if let presentationLayer = newView.layer.presentation() {
let evaluatedValue = presentationLayer.bounds.origin.x
print("evaluatedValue: \(evaluatedValue)")
}
else {
print(evaluatorLayer.presentation())
}
}
}
【问题讨论】:
标签: uiview core-animation calayer cabasicanimation