UIViewPropertyAnimator для NSLayoutConstraints заставляет представление исчезнуть
У меня есть 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 для ящика, и когда ящик перетаскивается, UIViewPropertyAnimator's fractionComplete
обновляется в зависимости от того, насколько далеко пользователь переместил ящик вверх в 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
в drawerChangedDistanceFromBottom
Может быть, я должен? Хотя я не хочу, чтобы анимация действительно выполнялась с 5-секундной продолжительностью, я просто хочу скраббируемую анимацию.
1 ответ
Я не уверен, что причина проблемы, но одно из добавленных мною ограничений было ограничение высоты = 0 для первичных и вторичных меток. Метки были также в виде стека. Я удалил метки из стека и все еще имел ту же проблему. На данный момент я преодолел проблему, изменив анимацию на CGAffineTransform
для перевода вместо добавления ограничения высоты = 0. Это не сработало при использовании CGAffineTransform
для масштаба (независимо от того, положил ли я метки в виде стека или нет).
Если у кого-то есть лучшее предложение, пожалуйста, дайте мне знать.