Представленный контроллер представления, встроенный в контроллер навигации с пользовательской анимацией - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть vc1, который представляет контроллер навигации, который содержит vc2.Проекция между vc1 и контроллером навигации - «Представлять модально», vc2 появляется со стандартной анимацией, снизу вверх.

Я хочу представить vc2, встроенный в контроллер навигации, из vc1 с пользовательской анимацией перехода.

Пример раскадровки

Я пробовал

class CustomAnimator: NSObject {
    func animationDuration() -> TimeInterval {
        return 1.0
    }

    fileprivate func animateCustomTransition(using transitionContext: UIViewControllerContextTransitioning) {
        // ...
    }
}

extension CustomAnimator: UIViewControllerAnimatedTransitioning {
    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return animationDuration()
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        animateCustomTransition(using: transitionContext)
    }
}

class CustomTransitionDelegate: NSObject {
    let animator: CustomAnimator
    override init() {
        animator = CustomAnimator()
        super.init()
    }
}

extension CustomTransitionDelegate: UIViewControllerTransitioningDelegate {
    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return self.animator
    }
}

class Vc2ViewController: UIViewController {

    // ...

    var customTranstionDelegate = CustomTransitionDelegate()

    //...
}

А затем:

(1) Установите значение transitioningDelegate для vc2.Очевидно, никакого эффекта.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let navController = segue.destination as? UINavigationController {
        if let controller = navController.viewControllers.first as? Vc2ViewController {
            controller.transitioningDelegate = controller.customTranstionDelegate
        }
    }
}

(2) Подкласс UINavigationController и установите его transitioningDelegate.vc2 появляется нужным образом, но панель навигации исчезла, и следующий контроллер просмотра после vc2 не появляется в «Show» segue.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let controller = segue.destination as? Vc2NavigationController {
        controller.transitioningDelegate = controller.customTranstionDelegate
    }
}

Как я могу представить vc2, встроенный в контроллер навигации, из vc1с пользовательской анимацией перехода?

1 Ответ

0 голосов
/ 12 декабря 2018

Вы можете использовать встроенный - https://developer.apple.com/documentation/uikit/uiviewcontrolleranimatedtransitioning

Чтобы добавить взаимодействие пользователя с переходом контроллера представления, вы должны использовать объект аниматора вместе с интерактивным объектом аниматора - пользовательский объект, который принимает UIViewControllerInteractiveTransitioningпротокол.

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