@Tkas

Почему view controller неактивен после перехода на него с другого view controller через navigation controller, используя custom animation transition?

Eсть 2 контроллера (ViewController (стартовый) и SecondViewController (зеленый)) и 1 navigation controller:
5cb43ed902036179850608.png

Мой проект использует кастомную анимацию:
import UIKit

class TransitionManager: NSObject, UIViewControllerAnimatedTransitioning, UIViewControllerTransitioningDelegate {
    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 0.8
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        var transform = CATransform3DIdentity
        let container = transitionContext.containerView
        guard let fromView = transitionContext.view(forKey: .from) else { return }
        guard let toView = transitionContext.view(forKey: .to) else { return }

        transform.m34 = -0.0019
        container.layer.sublayerTransform = transform
        container.insertSubview(toView, belowSubview: fromView)
        fromView.layer.anchorPoint = CGPoint(x: 0.0, y: 0.5)
        fromView.layer.position    = CGPoint(x: 0, y: UIScreen.main.bounds.midY)

        UIView.animate(withDuration: transitionDuration(using: transitionContext)) {
            fromView.layer.transform = CATransform3DMakeRotation(-.pi/2, 0, 1.0, 0)
        }
    }

    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return self
    }
}


В ViewController (который с дверью на картинке) используется задержка, чтобы запустить сегвей на следующий контроллер (зеленый):
class ViewController: UIViewController {
    let transitionManager = TransitionManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        DispatchQueue.main.asyncAfter(deadline: .now() + 0.3, execute: {
            self.performSegue(withIdentifier: "segue", sender: self)
        })
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard let navigationViewController = segue.destination as? UINavigationController else { return }

        navigationViewController.transitioningDelegate = transitionManager
    }
}


Во втором контроллере есть кнопка, при нажатии на которую должен произойти принт:
class SecondViewController: UIViewController, UIViewControllerTransitioningDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        print(view.isUserInteractionEnabled)
    }

    @IBAction func tapBtn(_ sender: UIButton) {
        print("btn pressed") //не срабатывает. Почему?
    }
}


Анимация срабатывает корректно, однако кнопка на втором контроллере не реагирует на нажатия. Строка
print(view.isUserInteractionEnabled)
выводит true.

В чем проблема? Почему объекты на втором контроллере не реагируют на действия пользователя?
  • Вопрос задан
  • 109 просмотров
Решения вопроса 1
doublench21
@doublench21 Куратор тега Swift
Быть может в completion вашей анимации надо все же сказать системе, что анимация завершена.

transitionContext.completeTransition(true)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы