Xcode 10: пользовательские анимированные переходы застряли - PullRequest
0 голосов
/ 16 сентября 2018

Мое приложение имеет два контроллера вида (VC A & B) и пользовательский переход между ними.

При использовании жеста панорамирования влево на VC A интерактивный анимированный переход модально представляет VC B поверх Aскользящий справа (справа налево).Чтобы закрыть VC B, пользователь может:

  • Использовать жест панорамирования вправо: запустит интерактивный переход, который сдвинет VC B вправо и откроет VC A. Положение VC B определеноинтерактивно с помощью состояния жеста панорамирования.Взаимодействие «управляется» объектом UIPercentDrivenInteractiveTransition.
  • Используйте кнопку «Закрыть» на панели навигации VC B.Это вызовет пользовательский переход (слайд вправо) без взаимодействия (просто анимированный).

Проблема в том, что тестирование выполняется на Xcode 10 Seed (сборка 10A254a) + iOS 12 Simulator (X или XR или XS)) Я могу легко добраться до состояния, когда пользовательский переход никогда не завершается, а пользовательский интерфейс остается в странном состоянии :

  • Пользовательский интерфейс застрял на VC B, и никакие жесты илиработает нажатие.
  • Приложение не зависло - я вижу, что журналы conosle все еще работают, и активна сетевая активность (в журнале нет ошибок)
  • Приостановить работу приложения в этом застрявшем состоянии я могусм. com.apple.main-thread не застрял.
  • Когда я нажимаю «Отладочная иерархия просмотра», происходит что-то странное: на экране sim я все еще вижу VC B и весь пользовательский интерфейс отключен ,На представлении основной вид отладчика - я вижу VC A подпредставления , нарисованные так, как будто переход сделан.На представлении отладчик оставил представление дерева - я вижу иерархию представления VC B .

Эта проблема никогда не возникала ни в какой предыдущей версии Xcode и / или iOS до Xcode 10 /iOS12.

Это мой animateTransition метод в моем пользовательском UIViewControllerAnimatedTransitioning

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

    guard let fromVC = transitionContext.viewController(forKey: .from), let toVC = transitionContext.viewController(forKey: .to) else {
        transitionContext.completeTransition(false)
        return
    }

    let containterView = transitionContext.containerView
    containterView.insertSubview(toVC.view, belowSubview: fromVC.view)

    let bounds = fromVC.view.bounds
    var xOffsetMultiplier : CGFloat = 0.0
    var yOffsetMultiplier : CGFloat = 0.0

    switch direction {
    case .up:
        yOffsetMultiplier  = -1.0
    case .right:
        xOffsetMultiplier  = 1.0
    case .left:
        xOffsetMultiplier  = -1.0
    case .down:
        yOffsetMultiplier  = 1.0
    }

    print(xOffsetMultiplier,bounds.size.width,bounds.size.height )
    UIView.animate(withDuration: duration, animations: {
        print("animating...")
        //fromVC.navigationController?.navigationBar.alpha = 0.0
        fromVC.view.frame = fromVC.view.frame.offsetBy(dx: xOffsetMultiplier * bounds.size.width, dy: yOffsetMultiplier * bounds.size.height)
    }, completion: { finished in
        print("completed animation")
        transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
        //fromVC.navigationController?.navigationBar.alpha = 1.0
    })

}

Отпечатки есть только для отладки.

Это последовательность, которая легковоссоздает проблему:

  1. Используйте жест панорамирования, чтобы начать интерактивный переход от B к A, но никогда не завершайте его - это вызовет cancel() для объекта UIPercentDrivenInteractiveTransition + Я могу убедиться, что анимация завершена,
  2. Нажмите кнопку «Закрыть», чтобы вызвать неинтерактивный переход для отмены B. B никогда не удаляется, а пользовательская анимация никогда не завершается!

На устройстве, которое я не смог воссоздатьэта проблема вообще (пока) - и все переходы работают как положено.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Попробуйте установить wantsInteractiveStart = false в вашем UIPercentDrivenInteractiveTransition

0 голосов
/ 17 сентября 2018

Итак, нашел источник того, почему переходы застряли между VC B и A, но все еще не совсем понимаем, в чем разница между Xcode9 / iOS11 и Xcode10 / iOS12, которые вызывали другое поведение.

Чтобы сократить его:

  • При использовании жеста панорамирования для инициирования интерактивного перехода для отмены VC BI выделите UIPercentDrivenInteractiveTransition, вызовите dismiss(animated:completion:) в VC и обновите его в соответствии с прогрессом панорамирования.В некоторых случаях, когда панорамирование не проходило достаточно «земли», мой обработчик жестов считает, что переходы отменены, и вызывает метод cancel() UIPercentDrivenInteractiveTransition
  • . После такой отмены нажатие кнопки закрытия инициируетnew dismiss(animated:completion:), но, поскольку UIPercentDrivenInteractiveTransition все еще выделен, он возвращается моим делегатом перехода, и ОС фактически пытается интерактивное увольнение, хотя это не было целью.Это ошибка с моей стороны, так как после вызова cancel я также должен убедиться, что делегат перехода не пытается интерактивный переход в этом случае (хотя на Xcode9 / iOS11 это не было).
  • причина, по которой переход «застрял», заключается в том, что это интерактивный переход без обновлений (без обновлений жестов при нажатии «закрыть». Я проверил это, принудив finish() к ошибочно выделенному UIPercentDrivenInteractiveTransition, чтобы он завершился, и все возвращаетсянормальное.

Устранение проблемы при переходе между режимами отклонения либо интерактивным, либо не основанным на взаимодействии с пользователем, особенно после отмены интерактивного,

Что я не понимаюВот почему не существует такого согласованного поведения между версиями Xcode / iOS. Эта проблема никогда не случалась со мной раньше ни на одном устройстве или на симуляторе. В способе обработки пользовательских анимаций / переходов есть что-то другое - в документах Apple нет ничего, что могло бы объяснить это.- возможно, во внутренней реализации траКонтекст nsition.

Из наивного "теста глаза" кажется, что анимация перехода на симуляторе Xcode10 медленнее во времени реакции и менее плавная, чем раньше, но все еще не объясняет это полностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...