UIViewPropertyAnimator для NSLayoutConstraints заставляет представление исчезнуть - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть 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()
    })
}

Я использую аниматор для интерполяции между двумя взаимоисключающими наборами ограничений.Я использую библиотеку Шкив для выдвижного ящика, и когда ящик перетаскивается, fractionComplete UIViewPropertyAnimator обновляется в зависимости от того, насколько пользователь переместил выдвижной ящик вверх в функции drawerChangedDistanceFromBottom Шкива.Библиотека выглядит так:

// 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 голосов
/ 03 февраля 2019

Я не уверен, что причина проблемы, но одним из добавленных мною ограничений было ограничение высоты = 0 для первичных и вторичных меток.Метки были также в виде стека.Я удалил метки из стека и все еще имел ту же проблему.На данный момент я преодолел эту проблему, изменив анимацию на CGAffineTransform для перевода вместо добавления ограничения height = 0.Это не сработало при использовании CGAffineTransform для масштаба (независимо от того, поместил ли я метки в виде стека или нет).

Если у кого-то есть лучшее предложение, пожалуйста, дайте мне знать.

...