所以我有2个视图控制器和一个导航控制器。单击屏幕时,第一个VC将转向第二个VC,并且有一个后退按钮,可让segue退回以返回第一个VC。
我不喜欢segue的垂直动画,所以(在一些帮助下)我创建了自定义的水平动画。
第一个VC在动画从右向左滑动时效果很好。但是一旦完成,第二个VC就不想放松(第二个VC应该从左到右)。
我确实得到了这个警告..
警告:尝试在TestApp.HomeViewController:0x7fce20410030上显示UINavigationController:0x7fce2082b000,其视图不在窗口层次结构中!
另外,如果我从第一个VC segue中获取脚本,那么我可以从第二个VC中取出适当的动画。
以下是segues的代码:
第一次VC
@IBAction func performSegue(_ sender: Any) {
if shouldPerformSegue(withIdentifier: "segue", sender: Any?.self) {
performSegue(withIdentifier: "segue", sender: nil)
}
}
@IBAction func unwindToHomeView(segue: UIStoryboardSegue) {
}
override func unwind(for unwindSegue: UIStoryboardSegue, towardsViewController subsequentVC: UIViewController) {
let segue = SegueFromLeft(identifier: unwindSegue.identifier, source: unwindSegue.source, destination: unwindSegue.destination)
segue.perform()
}
从右到左动画
let dst = self.destination
let src = self.source
let containerView = src.view.superview
dst.view.transform = CGAffineTransform(translationX: src.view.frame.size.width, y: 0)
containerView?.addSubview(dst.view)
UIView.animate(withDuration: 0.25, delay: 0.0, options: UIViewAnimationOptions.curveEaseInOut, animations: {
dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
}, completion: { success in
src.present(dst, animated: false, completion: nil)
})
从左到右动画
let dst = self.destination
let src = self.source
src.view.superview?.insertSubview(dst.view, at: 0)
UIView.animate(withDuration: 0.25, delay: 0.0, options: UIViewAnimationOptions.curveEaseInOut, animations: {
src.view.transform = CGAffineTransform(translationX: -src.view.frame.size.width, y: 0)
}, completion: { success in
src.dismiss(animated: false, completion: nil)
})
非常感谢任何帮助。
答案 0 :(得分:1)
您可以简单地将viewcontroller推送到您不需要显式处理左右动画的导航控制器。在VC1 navigationController?.pushViewController(VC2, animated: true)
中,只需用一个方便的后退按钮从右到左为VC2设置动画,可以用来动画VC2从左到右显示VC1。
答案 1 :(得分:0)
对于我的解决方案,我实际上取消了任何“自定义”动画,并且主要通过将导航控制器作为初始控制器移动来修复我的问题,连接到VC1。
从那里我刚推到下一个视图(VC2),并使用unwind segue返回(到VC1)。
推送的基本代码:
let vcName = "Main"
let viewController = storyboard?.instantiateViewController(withIdentifier: vcName)
self.navigationController?.pushViewController(viewController!, animated: true)