我有一个这样设置的 UIViewPropertyAnimator viewDidAppear
:
if animator == nil {
animator = UIViewPropertyAnimator(duration: 5.0, curve: .easeInOut, animations: { [weak self] in
guard let blockSelf = self else { return }
blockSelf.primaryPromptLabel.alpha = 0
blockSelf.secondaryPromptLabel.alpha = 0
blockSelf.backArrowButton.alpha = 1
NSLayoutConstraint.activate(blockSelf.constraintsToAdd ?? [])
NSLayoutConstraint.deactivate(blockSelf.constraintsToRemove ?? [])
blockSelf.view.layoutIfNeeded()
})
}
我正在使用动画师在两组相互排斥的约束之间进行插值。我正在使用Pulley库作为抽屉,当拖动抽屉时,UIViewPropertyAnimatorfractionComplete
会根据用户在drawerChangedDistanceFromBottom
Pulley 库的函数中向上移动抽屉的距离进行更新,如下所示:
// Extension to clamp a value within bounds
extension ClosedRange {
func clamp(_ value : Bound) -> Bound {
return self.lowerBound > value ? self.lowerBound
: self.upperBound < value ? self.upperBound
: value
}
}
// PulleyDrawerViewControllerDelegate in my view controller
func drawerChangedDistanceFromBottom(drawer: PulleyViewController, distance: CGFloat, bottomSafeArea: CGFloat) {
let bottomSafeSpace = drawer.bottomSafeSpace
let expandedHeight = drawer.visibleDrawerHeight
let partialHeight = drawer.partialRevealDrawerHeight(bottomSafeArea: bottomSafeSpace)
let percentExpanded = (0.0 ... 1.0).clamp(1 * (drawer.drawerDistanceFromBottom.distance-partialHeight) / (expandedHeight-partialHeight))
animator?.fractionComplete = percentExpanded
}
所描述的过程按预期工作,直到用户进入后台并返回应用程序。那时,我用约束制作动画的视图似乎只是消失了。我看到另一个问题表明 UIViewPropertyAnimator对生命周期做了奇怪的事情。也许是这样的事情导致了问题?
我也从不开始/完成动画师,我只是更新fractionComplete
in drawerChangedDistanceFromBottom
,也许我应该?虽然我不希望动画以 5 秒的持续时间实际运行,但我只想要一个可擦洗的动画。