5

Я упомянул this question и несколько вопросов о переходе на просмотр/просмотр контроллера, но до сих пор не смог найти удовлетворенный ответ. Большинство решений предлагают перевернуть представления вместо контроллеров просмотра. Однако два контроллера представления в моем приложении имеют совершенно другую логику работы и реализации, поэтому я избегаю их смешивания.Переключаться между двумя ViewControllers под тем же NavigationController

В моем приложении у меня есть модальный контроллер FrontViewController, который встроен в NavigationController. После нажатия одной кнопки на просмотр контроллер модального просмотра должен перевернуть на BackViewController и наоборот. Я когда-либо пробовал следующее FrontViewController:

let navi = UINavigationController(rootViewController: backController) 
navi.modalPresentationStyle = .CurrentContext 
navi.modalTransitionStyle = .FlipHorizontal 
self.presentViewController(backController, animated: true, completion: nil) 

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

Таким образом, я также пытался предотвратить ViewController стека и использовать transitionFromViewController в FrontViewController, используя тот же навигационный контроллер вместо:

self.navigationController!.addChildViewController(backController) 
self.willMoveToParentViewController(nil) 

self.navigationController!.transitionFromViewController(self, toViewController: backViewController, duration: 1, options: .TransitionFlipFromLeft, animations: {}, completion: ({Bool -> Void in 
    self.removeFromParentController() 
    c.didMoveToParentViewController(self) 
})) 

Затем я получил эту ошибку во время выполнения на executiing: Parent view controller is using legacy containment in call to -[UIViewController transitionFromViewController:toViewController: duration:options:animations:completion:]

Итак, как переход между двумя контроллерами представления при их предотвращении остается в стеке диспетчера представлений?

ответ

11

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

let transition = CATransition() 
transition.duration = 0.3 
transition.type = "flip" 
transition.subtype = kCATransitionFromLeft 
self.navigationController?.view.layer.addAnimation(transition, forKey: kCATransition) 
self.navigationController?.pushViewController(viewController!, animated: false) 

Обратите внимание, что параметр animated должен быть false. В противном случае по умолчанию раздвижного анимации происходит

+0

Это решение является простым и работает Как колдовство! Большое спасибо! – whitney13625

8

Смотрите эту демо-версию для вас:

Swift код flipAnimation:

let mainStory = UIStoryboard(name: "Main", bundle: nil) 
let search = mainStory.instantiateViewControllerWithIdentifier("SecondViewController") as! SecondViewController 
UIView.beginAnimations("animation", context: nil) 
UIView.setAnimationDuration(1.0) 
self.navigationController!.pushViewController(search, animated: false) 
UIView.setAnimationTransition(UIViewAnimationTransition.FlipFromLeft, forView: self.navigationController!.view, cache: false) 
UIView.commitAnimations() 

FlipViewController Animation

Выход:

enter image description here

+0

Это тоже хорошее решение, спасибо! – whitney13625

+0

Да, его возможно также в Nav следующей кнопке ... –

+0

извините, что я имел в виду кнопку навигации назад? –

1

Swift 3,0 + Если использовать анимацию блока UIView «s, убедитесь, что ваш viewController в UINavigationController стеки:

let viewController = ViewController(nibName: "xxx", bundle: nil) 
UIView.transition(with: self.navigationController!.view, duration: 1.0, options: .transitionFlipFromLeft, animations: { 
    self.navigationController?.pushViewController(viewController, animated: false) 
}, completion: nil) 
0

здесь студент NSObjectClass

var Arraydata:[Student] = [] 
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
     let arr = Arraydata[indexPath.row] 
     if indexPath.row == arr 
     { 
      let story = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController 

    UIView.beginAnimations("", context: nil) 
    UIView.setAnimationDuration(1.0) 
    UIView.setAnimationCurve(UIViewAnimationCurve.easeInOut) 
    UIView.setAnimationTransition(UIViewAnimationTransition.flipFromRight, for: (self.navigationController?.view)!, cache: false) 
    self.navigationController?.pushViewController(story, animated: true) 
    UIView.commitAnimations() 

     } 
    } 
-1
 override func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(true) 
     // for back button 
     changeTransition() 
    } 
     //btnMap.addTarget(self, action: #selector(searchHotelsResultVC.goToMap), for: .touchUpInside) 
     //btnMap.addTarget(self, action: #selector(MapViewController.backToList), for: .touchUpInside) 
func goToMap() { 
     // for pushing 
    changeTransition() 
navigationController?.pushViewController(settingsVC, animated: false) 
} 
func backToList() { 
     // for dismiss 
     changeTransition() 
     navigationController?.popViewController(animated: false) 
     dismiss(animated: true, completion: nil) 

    } 
    func changeTransition() { 
     let transition = CATransition() 
     transition.duration = 0.5 
     transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 
     //transition.type = kCATransitionPush 
     transition.type = "flip" 
     transition.subtype = kCATransitionFromLeft 
     navigationController?.view.layer.add(transition, forKey: kCATransition) 

    } 
Смежные вопросы