我正在尝试在两个viewControllers之间实现自定义转换。 ( Swift 3.0 )
在我的两个viewControllers之间,我有UISegue
种show
(animated = true
)。
所以我在第一个视图控制器的扩展中设置了UIViewControllerTransitioningDelegate
的委托方法:
extension DocumentsViewController : UIViewControllerTransitioningDelegate { ... }
我还通过协议实现了所需的方法:
animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
...
}
public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
...
}
现在执行segue
时,在firstViewController
我使用委托方法prepareForSegue
最终将transitioningDelegate
设置为我的`secondViewController,请参阅下文:
public override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
if let destination = segue.destination as? DocumentDetailViewController {
destination.transitioningDelegate = self
}
}
我检查了断点,委托已经设置好了我的firstViewController。
但是我的firstViewController中transitioningDelegate
的委托方法永远不会被触发,我不知道为什么。
有什么想法吗?
PS:在我的故事板中,我的segue have Animated to true
,所以这应该有效,但事实并非如此。
感谢。
已解决: MadreDeDios,Matt和Tushar的混合答案。
1:由于我想在我的应用中保留导航,因此我必须将第一个viewController符合UINavigationControllerDelegate
而不是UIViewControllerTransitioningDelegate
。 (参见 MadreDeDios回答)。
2:根据此协议,我实现了以下委托方法:
public func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
...
}
3:我之前在viewDidLoad()
的{{1}}处设置了代理人(请参阅马特的回答):
firstViewController
4:我正在使用手动推送而不是segue来显示我的override public func viewDidLoad() {
super.viewDidLoad()
//...
self.navigationController?.delegate = self
}
(请参阅 Tushar的回答)
现在这个有效,谢谢。
答案 0 :(得分:6)
因为您正在使用push segue,我假设您也在使用导航控制器。
当您使用UINavigationController
时,它将成为每个转场,动画甚至应用程序方向的参考。
我的建议是使用导航控制器作为所有动画的管理器。您需要做的就是添加以下几点:
extension MyNavigationController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
//Check for the good animation
return MyAnimation()
}
}
在MyNavigationController
班级
override func viewDidLoad() {
super.viewDidLoad()
//This is the key
self.delegate = self
//Only if you want to animate the presentation of your navigation controller itself, the first time it appears:
self.transitioningDelegate = self
}
答案 1 :(得分:5)
问题是你设置transitioningDelegate
为时已晚。 方式为时已晚。它需要在视图控制器的生命周期的早期设置 very 。我建议在视图控制器的初始化程序中设置此属性。
答案 2 :(得分:1)
尝试删除故事板的转换并手动执行视图显示代码,并明确提及动画参数的“true”:
presentViewController(documentVC,animated:true,completion:nil)