iOS:容器视图-更改子视图控制器时动画推送过渡

4
苹果公司在这篇文章中讨论了如何使容器视图控制器在两个子视图控制器之间进行转换。我想要实现一个简单的纵向推进滑动效果,类似于UIModalTransitionStyleCoverVertical 中的推进效果。然而,transitionFromViewController 只允许使用UIViewAnimationOptions ,而不是转换样式,因此如何实现滑动视图上移的动画效果呢?
令人奇怪的是,在子视图控制器之间进行转换时,不能像UINavigationController中一样调用简单的推进方法来实现转换动画。
1个回答

6

加载子视图,将其框架设置为在底部屏幕下方的y坐标。在动画块中将其更改为0。示例:

enum Animation {
    case LeftToRight
    case RightToLeft
}

func animationForLoad(fromvc: UIViewController, tovc: UIViewController, with animation: Animation) {

        self.addChildViewController(tovc)
        self.container.addSubview(tovc.view)
        self.currentVC = tovc

        var endOriginx: CGFloat = 0

        if animation == Animation.LeftToRight {
            tovc.view.frame.origin.x = -self.view.bounds.width
            endOriginx += fromvc.view.frame.width
        } else {
            tovc.view.frame.origin.x = self.view.bounds.width
            endOriginx -= fromvc.view.frame.width
        }

        self.transition(from: fromvc, to: tovc, duration: 0.35, options: UIViewAnimationOptions.beginFromCurrentState, animations: {
            tovc.view.frame = fromvc.view.frame
            fromvc.view.frame.origin.x = endOriginx
            }, completion: { (finish) in
                tovc.didMove(toParentViewController: self)
                fromvc.view.removeFromSuperview()
                fromvc.removeFromParentViewController()               
        })           
    }

上述代码是在两个子视图之间使用水平推入和弹出动画进行转换。

需要一个共同的基础视图控制器。由于我没有共同的基础视图控制器,它会给我一个错误(崩溃)。 - Hemang
接受的答案确实是正确的,只是编译器有一个小警告。使用上面的代码,您将收到有关转换期间不平衡的begin/end调用的警告。这是由于苹果UIViewController.trasition方法,根据苹果文档:>此方法将第二个视图控制器的视图添加到视图层次结构中,然后执行在动画块中定义的动画。动画完成后,它会从视图层次结构中删除第一个视图控制器的视图。为了避免这种警告,您只需要在调用addSubview方法之前删除它即可。 - Simone Figliè

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接