首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PushViewController的细节?

PushViewController的细节?
EN

Stack Overflow用户
提问于 2016-05-27 23:24:27
回答 1查看 48关注 0票数 0

我想要做的是一个自定义的动画,把ViewController从左侧的端推出来。我已经创建了我的自定义转换委托,我提供了我的自定义动画,一切正常工作(从左边的新视图幻灯片)。唯一的问题是,iOS中的push动画不仅仅是从右侧滑动视图。被模糊的VC也在向与被推送的VC相同的方向移动。还有导航条有点闪烁。当然,我可以尝试通过猜测参数应该是什么来模仿这种行为(例如,在不同的iPhones上被模糊化的VC移动了多少),但是也许可以在某个地方找到值呢?非常感激的帮助。

EN

回答 1

Stack Overflow用户

发布于 2016-05-27 23:46:05

我将创建一个符合UIViewControllerAnimatedTransitioning协议的对象。

代码语言:javascript
复制
class CustomHorizontalSlideTransition: NSObject, UIViewControllerAnimatedTransitioning {

    var operation: UINavigationControllerOperation = .Push

    convenience init(operation: UINavigationControllerOperation) {
        self.init()
        self.operation = operation
    }

    func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
        return 0.5
    }

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {

        let containerView = transitionContext.containerView()

        let disappearingVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
        let appearingVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!

        let bounds = UIScreen.mainScreen().bounds

        if self.operation == .Push {
            appearingVC.view.frame = CGRectOffset(bounds, -bounds.size.height, 0)
            containerView!.addSubview(disappearingVC.view)
            containerView!.addSubview(appearingVC.view)
        } else {
            appearingVC.view.frame = bounds
            disappearingVC.view.frame = bounds
            containerView!.addSubview(appearingVC.view)
            containerView!.addSubview(disappearingVC.view)
        }

        UIView.animateWithDuration(transitionDuration(transitionContext),
            delay: 0.0,
            options: UIViewAnimationOptions.CurveEaseInOut,
            animations: { () -> Void in

                if self.operation == .Push {
                    appearingVC.view.frame = bounds
                } else {
                    disappearingVC.view.frame = CGRectOffset(bounds, -bounds.size.width, 0)
                }

            }) { (complete) -> Void in
                transitionContext.completeTransition(true)
        }
    }
}

然后,在“从”和“到”视图控制器中,在视图ViewDidAppear中将导航控制器的委托设置为self

代码语言:javascript
复制
override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    navigationController?.delegate = self
}

在两个视图控制器中,重写以下内容以提供transitionAnimatedTransition委托方法,并返回动画中遵循协议的实例

代码语言:javascript
复制
override func transitionAnimatedTransition(operation: UINavigationControllerOperation) -> UIViewControllerAnimatedTransitioning? {
        return CustomHorizontalSlideTransition(operation: operation)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37493624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档