我的根视图控制器左侧有一个按钮,触发推送到另一个视图控制器。我想推动segue从左侧向右侧滑动;我也希望pop动画(对于这个视图控制器)从右到左。
我能够使用此代码为推送创建自定义segue以制作所需的动画:
import UIKit
class LeftToRightSegue: UIStoryboardSegue {
override func perform() {
let src: UIViewController = self.sourceViewController
let dst: UIViewController = self.destinationViewController
let finalFrame = src.view.bounds
let initalFrame = CGRect(x: -finalFrame.width, y: 0, width: finalFrame.width, height: finalFrame.height)
dst.view.frame = initalFrame
UIView.animateWithDuration(0.25, animations: { dst.view.frame = finalFrame })
src.navigationController!.pushViewController(dst, animated: false)
}
}
然后我尝试使用以下代码为pop创建一个segue:
import UIKit
class RightToLeftSegue: UIStoryboardSegue {
override func perform() {
let src: UIViewController = self.sourceViewController
let dst: UIViewController = self.destinationViewController
let finalFrame = src.view.bounds
let initalFrame = CGRect(x: 2*finalFrame.width, y: 0, width: finalFrame.width, height: finalFrame.height)
dst.view.frame = initalFrame
UIView.animateWithDuration(0.25, animations: { dst.view.frame = finalFrame })
dst.navigationController!.popViewControllerAnimated(false)
}
}
但是我收到了错误:
fatal error: unexpectedly found nil while unwrapping an Optional value
在这一行:
dst.navigationController!.popViewControllerAnimated(false)
因为导航控制器(由于某种原因)为零。
我想要的只是推动和弹出的动画被颠倒,无论它是否与自定义segues无关。有谁知道如何修复这个实现,或者创建一个更好的实现?
更新:我发现了一个非常糟糕的流行音乐解决方案:
let main = self.navigationController!.viewControllers.first!
self.navigationController!.viewControllers.removeAtIndex(0)
self.navigationController!.pushViewController(main, animated: true)
self.navigationController!.viewControllers.removeAtIndex(0)
我绝对愿意接受更好的解决方案。