Basi c проблема с пользовательским переходом с помощью контроллера навигации - PullRequest
0 голосов
/ 14 февраля 2020

В своей работе над многоэкранным приложением iOS я пытаюсь заставить работать мою первую анимированную транзакцию. Вместо использования стандартных анимаций при представлении модальных и полноэкранных экранов я хочу иметь горизонтальный слайд в анимации.

Я сделал эту работу, переопределив perform в UIStoryboardSegue, и заставил анимацию и транзакцию выполняться отсюда.

В целом, это работает, за исключением одного случая, когда навигационный контроллер встраивает представление.

В этом случае я следовал учебному пособию, показывающему, как именно выполняется пользовательская транзакция. достигается путем реализации протокола UINavigationControllerDelegate для конкретного контроллера навигации.

import Foundation
import UIKit

class AnimatedNavigationController: UINavigationController, UINavigationControllerDelegate {

    override func viewDidLoad() {

        super.viewDidLoad()
        delegate = self
    }

    func navigationController(_ navigationController: UINavigationController,
                              animationControllerFor operation: UINavigationController.Operation,
                              from fromVC: UIViewController,
                              to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {

        return NavigationControllerTransition()
    }
}

К сожалению, делегат, который должен возвращать объект анимации:

navigationController(_:animationControllerFor:from:to:)

, никогда не вызывается и это моя основная проблема.

В упомянутом учебнике кнопка используется для выполнения вызова к контроллеру навигации, который выдвигает конечный вид с анимацией, установленной в true:

navigationController.pushViewController(view, animated:true)

В моем случае, я подозреваю, что проблема заключается в том, что Контроллер навигации выдвигает представление, не устанавливая для параметра анимации значение true, и это объясняет, почему делегат транзакции никогда не вызывается.

(подтверждение этой теории, конечно, немного поможет).

Следовательно, я попытался реализовать пользовательский переход, который представляет представление, вызвав функцию pu sh с анимацией, установленной в true.

К сожалению, я не смог заставить это работать.

Когда вызывается navigationController.pushViewController(view, animated:true), возникает исключение, говорящее о том, что представление уже выдвинуто.

Я много пробовал без удачи. Код выглядит так:

class NavigationControllerSegue: UIStoryboardSegue {

    override func perform() {

        let navigationController = self.destination as! UINavigationController

        let view = navigationController.viewControllers.first!

        navigationController.pushViewController(view, animated: true)
    }
}

1 Ответ

0 голосов
/ 14 февраля 2020

Эй, прежде всего мы говорим о двух разных анимациях ... первая UIStoryboardSegue создает пользовательский подкласс UIStoryboardSegue, и это назначается следующему вопросу, задающему идентификатор для следующего, ниже просто вызов из ViewController 'a self.performSegue (withIdentifier: "YOUR-ID", sender: nil), пример подкласса UIStoryboardSegue:

import UIKit
// Example =>
class ScaleSegue: UIStoryboardSegue {

    override func perform() {
        self.scale()
    }

    func scale() {
        let toViewController = self.destination 
        let fromViewController = self.source

        let containerView = fromViewController.view.superview
        let originalCenter = fromViewController.view.center

        //let originalCenter = self.posizioneClick

        toViewController.view.transform = CGAffineTransform.init(scaleX: 0.05, y: 0.05)
        toViewController.view.center = originalCenter

        containerView?.addSubview(toViewController.view)

        UIView.animate(withDuration: 0.5, delay: 0.0, options: .curveEaseInOut, animations: {
            toViewController.view.transform = CGAffineTransform.identity
        }, completion: { success in
            fromViewController.present(toViewController, animated: false, completion: nil)
        })
    }

}

Теперь вам нужно создать переход из раскадровки и установить в качестве пользовательского класса последовательности из AttributeInspector:

Screen-Storyboard-example

Теперь, чтобы использовать это, вам просто нужно вызвать из контроллера вида => self.performSegue (withIdentifier: " segue1 ", отправитель: ноль). Отличается способ реализации Transition с UIViewControllerTransitioningDelegate. Если вам нужно дать мне знать, я могу привести вам примеры, использующие эту технику, так долго.

...