我正在使用UIViewPropertyAnimator来运行数组交互式动画,而我遇到的一个问题是,每当我反转动画时,我都无法再次向前播放动画。
我正在使用三个功能与平移手势识别器一起处理动画。
private var runningAnimations = [UIViewPropertyAnimator]()
private func startInteractiveTransition(gestureRecognizer: UIPanGestureRecognizer, state: ForegroundState, duration: TimeInterval) {
if runningAnimations.isEmpty {
animateTransitionIfNeeded(gestureRecognizer: gestureRecognizer, state: state, duration: duration)
}
for animator in runningAnimations {
animator.pauseAnimation()
animationProgressWhenInterrupted = animator.fractionComplete
}
}
private func animateTransitionIfNeeded(gestureRecognizer: UIPanGestureRecognizer, state: ForegroundState, duration: TimeInterval) {
guard runningAnimations.isEmpty else {
return
}
let frameAnimator = UIViewPropertyAnimator(duration: duration, dampingRatio: 1) {
switch state {
case .expanded:
// change frame
case .collapsed:
// change frame
}
}
frameAnimator.isReversed = false
frameAnimator.addCompletion { _ in
print("remove all animations")
self.runningAnimations.removeAll()
}
self.runningAnimations.append(frameAnimator)
for animator in runningAnimations {
animator.startAnimation()
}
}
private func updateInteractiveTransition(gestureRecognizer: UIPanGestureRecognizer, fractionComplete: CGFloat) {
if runningAnimations.isEmpty {
print("empty")
}
for animator in runningAnimations {
animator.fractionComplete = fractionComplete + animationProgressWhenInterrupted
}
}
我注意到的是,在我反转动画然后调用animateTransitionIfNeeded之后,frameAnimator被追加到正在运行的动画中,但是当我在此之后立即调用updateInteractiveTransition并检查runningAnimations时,它是空的。
因此,我被认为可能与swift可能如何处理内存或UIViewAnimating如何完成动画有关。
有什么建议吗?
答案 0 :(得分:0)
我开始意识到这个问题,即UIViewPropertyAnimator如何在反转时处理布局约束。 我在网上或官方文档中找不到很多详细信息,但确实找到了很多帮助。
Animator只是将视图动画化为新的帧。但是,无论是否反转,无论是否反转动画师,新约束仍然有效。因此,在动画制作者完成后,如果以后的自动布局再次布局视图,我希望这些视图会进入当前活动约束所设置的位置。简而言之:动画师对帧变化进行动画处理,但不约束自己。这意味着反转动画师会反转帧,但不会反转约束-自动布局执行另一个布局周期后,就会再次应用它们。
像平常一样,您设置约束并致电view.layoutIfNeeded()
animator = UIViewPropertyAnimator(duration: duration, dampingRatio: 1) {
[unowned self] in
switch state {
case .expanded:
self.constraintA.isActive = false
self.constraintB.isActive = true
self.view.layoutIfNeeded()
case .collapsed:
self.constraintB.isActive = false
self.constraintA.isActive = true
self.view.layoutIfNeeded()
}
}
现在,由于我们的动画师具有反转功能,因此我们添加了完成处理程序,以确保使用完成位置在完成时激活正确的约束。
animator.addCompletion { [weak self] (position) in
if position == .start {
switch state {
case .collapsed:
self?.constraintA.isActive = false
self?.constraintB.isActive = true
self?.view.layoutIfNeeded()
case .expanded:
self?.constraintA.isActive = false
self?.constraintB.isActive = true
self?.view.layoutIfNeeded()
}
}
}
答案 1 :(得分:0)
动画师对视图的动画属性进行操作,例如框架,中心, alpha 和变换属性,从您提供的块中创建所需的动画。
这是文档的关键部分。 您可以正确设置动画: 框架,中心,alpha和变换,因此您将无法正确设置NSConstraints的动画。
您应该在addAnimations
块内修改视图框架