嗯,我还没有一个令人满意的答案(至少那会让我满意),但我想至少添加一些我能够通过一些实验获得的见解。
首先,当viewController 不是当前呈现的动画时,动画似乎结束了。在您的情况下,这意味着动画停止并以状态结束,其中视图大 1.3 倍,并停止重复。 layoutSubviews 仅在您第一次展示时才会被调用。至少 viewController.viewDidLayoutSubviews 仅在开始时调用,而不是在您返回时调用(因此 layoutSubviews 在视图重新出现时不会被执行) - 因此动画不会重新启动。
我尝试将动画移动到 UIViewController 的 viewDidAppear - 这也不起作用,因为停止动画会导致视图已缩放 1.3 倍的状态。在创建动画之前将状态重置为 CGAffineTransform.identity 确实有效。
现在,正如我所说,这可以作为一种解决方法,让您了解如何让它工作,但是,我认为您真正需要的是一些钩子,它可以告诉您的视图(而不是 viewController)它再次出现。但是下面这个最小的例子至少可以帮助其他人看一看,而不是从头开始。
import UIKit
import PlaygroundSupport
class MyViewController : UIViewController {
let animator = UIViewPropertyAnimator(duration: 1, timingParameters: UICubicTimingParameters(animationCurve: .linear))
init(title: String) {
super.init(nibName: nil, bundle: nil)
self.title = title
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
let animatableView = UIView()
override func loadView() {
let view = UIView()
view.backgroundColor = .white
animatableView.frame = CGRect(x: 150, y: 400, width: 100, height: 100)
animatableView.backgroundColor = UIColor.magenta
view.addSubview(animatableView)
self.view = view
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.animatableView.transform = CGAffineTransform.identity
UIView.animate(withDuration: 1.0, delay: 0, options: [.repeat, .autoreverse], animations: {
self.animatableView.transform = CGAffineTransform(scaleX:
1.3, y: 1.3)
}, completion: nil)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
print("\(self.title) >> Lay out")
}
}
let tabBar = UITabBarController()
tabBar.viewControllers = [MyViewController(title: "first"), MyViewController(title: "second"), MyViewController(title: "third")]
tabBar.selectedIndex = 0
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = tabBar
编辑
我添加了几行代码来检查 self.animatableView.layer.animationKeys() 是否包含任何动画,似乎切换选项卡会从视图层移除动画 - 所以你必须找到一种方法在每次视图重新出现时添加动画。
编辑 2
所以我会选择@SWAT 的答案并使用willMove(toWindow:) 而不是layoutSubviews。