Я пытаюсь создать настраиваемый переход контроллера представления, который является интерактивным и прерывается с помощью следующих API:
- UIViewControllerAnimatedTransitioning
- UIPercentDrivenInteractiveTransition
- UIViewControllerTransitioningDelegate
- UIViewPropertyAnimator
Я хочу добиться того, чтобы я мог представить контроллер представления модально, а затем использовать UIPanGestureRecognizer
, чтобы отклонить представленный контроллер представления, перетащив его вниз. Если я уберу палец в верхней половине экрана, переход должен быть отменен, в противном случае переход будет успешно завершен.
Вот код проблемы:
func handlePanGesture(gestureRecognizer: UIPanGestureRecognizer) {
let translation = gestureRecognizer.translation(in: presentedViewController.view)
switch gestureRecognizer.state {
case .began:
interacting = true
presentingViewController.dismiss(animated: true) {
print("Dismissal Completion Callback is Called.")
// How can I know the dismissal is successful or cancelled.
}
case .changed:
let fraction = (translation.y / UIScreen.main.bounds.height)
update(fraction)
case .ended, .cancelled:
interacting = false
if (percentComplete > 0.5) {
finish()
} else {
cancel()
}
default:
break
}
}
Мой код отлично работает с аспектами пользовательского интерфейса и взаимодействия, но я не понимаю поведения функции func dismiss(animated flag: Bool, completion: (() -> Void)? = nil)
.
В .began
случае Pan Gesture
вызывается presentingViewController.dismiss(animated: true) { ... }
, поэтому начинается настраиваемый переход. Но обратный вызов completion
всегда вызывается независимо от того, отменен переход увольнения или нет.
Я смотрел эти видео WWDC:
Они используют пример кода для демонстрации настраиваемого перехода с UINavigationController и не упоминают обратный вызов увольнения.
presentingViewController.dismiss(animated: true) {
debugPrint("Dismissal Completion Called")
debugPrint("[ presentedViewController.transitionCoordinator?.isCancelled \(self.presentedViewController.transitionCoordinator?.isCancelled) ]")
}
В документе о параметре completion
:
завершение
Блок, выполняемый после закрытия контроллера представления. Этот блок не имеет возвращаемого значения и не принимает параметров. Вы можете указать для этого параметра nil.
Вопрос
Каково истинное значение Completion
, поскольку он всегда вызывается после отмены или завершения пользовательского перехода?
Когда я использую настраиваемый переход с презентацией и увольнением, как лучше всего обрабатывать реальное завершение увольнения для обновления пользовательского интерфейса и данных?