В swift, как выполнить переход с анимацией .crossDissolve?

#swift #animation #segue #fade

#swift #Анимация #segue #затухание

Вопрос:

В моем первом контроллере просмотра я пытаюсь выполнить переход после анимации с помощью альфа-метода. Я указываю в переходе, что modalTransitionStyle — это .crossDissolve, но он этого не сделал. он работает как метод push.

Два ViewControllers находятся под NavigationController и находятся в одной и той же раскадровке, но в двух разных представлениях.

Вот мой код:

 import UIKit

class AnimationPageDeDemarrageController: UIViewController {
    
    var personne = PersonneController()
    
    @IBOutlet var slogan: UILabel!
    @IBOutlet var vueDuSlogan: UIView!
    @IBOutlet var vueBlancheDuSlogan: UIView!
    @IBOutlet var vueBlanche: UIView!
    @IBOutlet var logo: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.vueBlanche.alpha = 0
        self.slogan.alpha = 0
        self.vueDuSlogan.alpha = 0
        self.vueBlancheDuSlogan.alpha = 0
        navigationController?.setNavigationBarHidden(true, animated: false)
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.faireApparaitreLaPage()
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.setNavigationBarHidden(false, animated: true)
    }
    
    private func faireApparaitreLaPage() {
        UIView.animate(withDuration: 1, delay: 0, animations: {
            self.vueBlanche.alpha = 1.0
            self.slogan.alpha = 1
            self.vueDuSlogan.alpha = 1
            self.vueBlancheDuSlogan.alpha = 1
        }, completion: {
            done in
            if done {
                self.segueVersMenuController()
            }
        })
    }
    
    // segue vers MenuController
    private func segueVersMenuController() {
        //Segue vers la page menuViewController
          let menuViewController = storyboard?.instantiateViewController(identifier: "MenuViewController") as? MenuViewController
        menuViewController?.modalTransitionStyle = .crossDissolve
        menuViewController?.modalPresentationStyle = .fullScreen
            menuViewController?.personne = personne

         self.navigationController?.pushViewController(menuViewController!, animated: true)
    }

}
  

я пробовал другой тип перехода, и приложение зависает.
Вот код:

     private func presentMenuViewController() {
        let menuViewController = MenuViewController()
        menuViewController.personne = personne
        menuViewController.modalPresentationStyle = .fullScreen
        menuViewController.modalTransitionStyle = .crossDissolve
        present(menuViewController, animated: true)
    }
  

Комментарии:

1. Присвоение имени контроллеру представления «versMenuViewControllerSegue» очень сбивает с толку. Это не переход, это контроллер представления. Вы должны избавиться от части «перехода» в имени этой переменной.

2. @DuncanC хорошо, я переименую его

Ответ №1:

.modalTransitionStyle свойство предназначено только для модальных переходов. Нажатие не является модальным переходом.

Вам нужно будет создать пользовательский подкласс UIStoryboardSegue .

Комментарии:

1. но почему мое второе решение приводит к сбою приложения?

2. Создание контроллера представления с использованием кода типа `let MenuViewController = MenuViewController ()` почти всегда является неправильным способом сделать это. Это создает контроллер представления без загрузки каких-либо его представлений. Вы должны использовать instantiateViewController(identifier:) вызов UIStoryboard из вашей первой версии, чтобы создать свой контроллер представления во втором решении.

3. У меня нет примера пользовательского push-перехода. Тем не менее, вы должны быть в состоянии найти пример кода в Интернете.

Ответ №2:

Я нашел ответ на свой вопрос, и вот код функции для использования вместо segueVersMenuController() :

 private func fadeTransition() {
        let transition: CATransition = CATransition()
        transition.duration = 1.75
        transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)
        transition.type = CATransitionType.fade
        self.navigationController!.view.layer.add(transition, forKey: nil)

        let menuViewController = self.storyboard?.instantiateViewController(withIdentifier: "MenuViewController") as! MenuViewController
        menuViewController.personne = self.personne
        self.navigationController?.pushViewController(menuViewController, animated: false)
    }