iOS 自定义 Segue - 滑过效果
iOS custom Segue - Slide over effect
我第一次尝试构建自定义转场。期望的结果是在前一张幻灯片后面创建新的 ViewController,然后使前一张幻灯片看起来好像是屏幕上的 ejected/removed。我的问题是我无法做到这一点。如果我在前一个下方创建新的(在这种情况下两者都向上滑动,一个弹出另一个插入)没关系,但这不是我想要做的。我唯一能做的就是单独向上滑动前一个,但它下面有一个黑色背景而不是新视图...
这是我的代码(两者都在那个代码上滚动,这不是预期的结果):
override func perform() {
let viewControllerToRemove = self.sourceViewController.view as UIView!
let viewControllerToShow = self.destinationViewController.view as UIView!
let screenWidth = UIScreen.mainScreen().bounds.size.width
let screenHeight = UIScreen.mainScreen().bounds.size.height
viewControllerToShow.frame = CGRectMake(0.0, screenHeight, screenWidth, screenHeight)
let window = UIApplication.sharedApplication().keyWindow
window?.insertSubview(viewControllerToShow, aboveSubview: viewControllerToRemove)
UIView.animateWithDuration(0.6, animations: { () -> Void in
viewControllerToShow.frame = CGRectOffset(viewControllerToShow.frame, 0.0, -screenHeight)
viewControllerToRemove.frame = CGRectOffset(viewControllerToRemove.frame, 0.0, -screenHeight)
}) { (Finished) -> Void in
self.sourceViewController.presentViewController(self.destinationViewController as UIViewController,
animated: false,
completion: nil)
}
}
欢迎任何帮助,
提前致谢!
您应该使用转换管理器,请参阅这些委托:
UIViewControllerAnimatedTransitioning 和 UIViewControllerTransitioningDelegate
对于你的动画来说,如果有一个全局容器就会容易得多,因为在你的动画中只有一个视图是动画的。
使用转换管理器,两个视图都在一个转换容器中,因此您可以将 destinationView 作为可见背景。
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
// get reference to our fromView, toView and the container view that we should perform the transition in
let container = transitionContext.containerView()
let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)!
let toView = transitionContext.viewForKey(UITransitionContextToViewKey)!
然后将框架设置为在同一位置具有两个视图,然后执行如下操作:
container.addSubview(toView)
container.addSubview(fromView)
container.sendSubviewToBack(toView)
当您对 fromView 进行动画处理时,这次您将在后台看到 toView。
有关此 link 的更多信息:http://mathewsanders.com/animated-transitions-in-swift/
我第一次尝试构建自定义转场。期望的结果是在前一张幻灯片后面创建新的 ViewController,然后使前一张幻灯片看起来好像是屏幕上的 ejected/removed。我的问题是我无法做到这一点。如果我在前一个下方创建新的(在这种情况下两者都向上滑动,一个弹出另一个插入)没关系,但这不是我想要做的。我唯一能做的就是单独向上滑动前一个,但它下面有一个黑色背景而不是新视图...
这是我的代码(两者都在那个代码上滚动,这不是预期的结果):
override func perform() {
let viewControllerToRemove = self.sourceViewController.view as UIView!
let viewControllerToShow = self.destinationViewController.view as UIView!
let screenWidth = UIScreen.mainScreen().bounds.size.width
let screenHeight = UIScreen.mainScreen().bounds.size.height
viewControllerToShow.frame = CGRectMake(0.0, screenHeight, screenWidth, screenHeight)
let window = UIApplication.sharedApplication().keyWindow
window?.insertSubview(viewControllerToShow, aboveSubview: viewControllerToRemove)
UIView.animateWithDuration(0.6, animations: { () -> Void in
viewControllerToShow.frame = CGRectOffset(viewControllerToShow.frame, 0.0, -screenHeight)
viewControllerToRemove.frame = CGRectOffset(viewControllerToRemove.frame, 0.0, -screenHeight)
}) { (Finished) -> Void in
self.sourceViewController.presentViewController(self.destinationViewController as UIViewController,
animated: false,
completion: nil)
}
}
欢迎任何帮助, 提前致谢!
您应该使用转换管理器,请参阅这些委托: UIViewControllerAnimatedTransitioning 和 UIViewControllerTransitioningDelegate
对于你的动画来说,如果有一个全局容器就会容易得多,因为在你的动画中只有一个视图是动画的。
使用转换管理器,两个视图都在一个转换容器中,因此您可以将 destinationView 作为可见背景。
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
// get reference to our fromView, toView and the container view that we should perform the transition in
let container = transitionContext.containerView()
let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)!
let toView = transitionContext.viewForKey(UITransitionContextToViewKey)!
然后将框架设置为在同一位置具有两个视图,然后执行如下操作:
container.addSubview(toView)
container.addSubview(fromView)
container.sendSubviewToBack(toView)
当您对 fromView 进行动画处理时,这次您将在后台看到 toView。
有关此 link 的更多信息:http://mathewsanders.com/animated-transitions-in-swift/