#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)
}