iOS 7更改pushviewcontroller动画方向

iOS 7更改pushviewcontroller动画方向,ios,animation,push,direction,Ios,Animation,Push,Direction,当我按下viewcontroller时,动画总是从右向左。我想将该动画更改为从左到右的反转。 我已经尝试过这个代码,但不起作用。动画仍然是从右向左。我怎样才能简单而正确地做到这一点?我需要帮助。提前谢谢 //NOT WORKING myViewController *mController = [self.storyboard instantiateViewControllerWithIdentifier:@"myViewController"]; CATransition *transiti

当我按下viewcontroller时,动画总是从右向左。我想将该动画更改为从左到右的反转。 我已经尝试过这个代码,但不起作用。动画仍然是从右向左。我怎样才能简单而正确地做到这一点?我需要帮助。提前谢谢

//NOT WORKING
myViewController *mController = [self.storyboard instantiateViewControllerWithIdentifier:@"myViewController"];

CATransition *transition = [CATransition animation];
transition.duration = 0.3;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;

[self.view.layer addAnimation:transition forKey:nil];

[self.navigationController pushViewController:mController animated:YES];

您实际上做得很对,但据我从您的代码中了解,您并没有重写该方法:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
因此,您需要从
UINavigationController
继承并重写上述方法

我是这样做的(按+弹出):

推送:

流行音乐:


因为这个问题提到了iOS 7,我很惊讶答案竟然没有提到iOS 7中引入的动画转换API

如果你想直接进入GitHub,objc.io的家伙们有一篇很好的帖子,里面有一个链接的项目

查看文档,您将看到以下内容:

@availability(iOS, introduced=7.0)
optional func navigationController(navigationController: UINavigationController, 
animationControllerForOperation operation: UINavigationControllerOperation, 
fromViewController fromVC: UIViewController,
 toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?
或者在Objective-C中

- (id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                                   animationControllerForOperation:(UINavigationControllerOperation)operation
                                                fromViewController:(UIViewController *)fromVC
                                                  toViewController:(UIViewController *)toVC  NS_AVAILABLE_IOS(7_0);
我通常在App委托中创建它,这样它就可以在任何地方被引用。您还可以基于每个视图控制器设置委托,创建自定义的UINavigationController子类,或者在您认为合适的任何位置

2.创建自定义动画师 现在我们需要一个符合
UIViewControllerAnimatedTransitioning
协议的对象。每当需要动画过渡时,将调用此对象来应用动画。此示例是一个简单的动画,它在过渡中淡入并展开fromView,使其与推送相关

class CustomPushExpansionTransitioner: NSObject, UIViewControllerAnimatedTransitioning {
    func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {
        return 1
    }

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
        let fromView: UIView = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
        let toView: UIView = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
        let container = transitionContext.containerView()
        container.addSubview(toView)
        container.bringSubviewToFront(fromView)

        toView.frame = container.convertRect(fromView.bounds, fromView: fromView)

        UIView.animateWithDuration(transitionDuration(transitionContext),
            animations: { () -> Void in
                fromView.alpha = 0
                fromView.transform = CGAffineTransformConcat(fromView.transform, CGAffineTransformMakeScale(1.3, 1.3))
        }) { (complete) -> Void in
            transitionContext.completeTransition(true)
        }
    }
}
3.如有必要,向动画师出售 现在我们需要实现UINavigationController委托,并在需要时提供自定义动画

extension NavigationCoordinationController: UINavigationControllerDelegate {
    func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        switch operation {
        case .Push:
            return LaunchToHomeTransitioner()
        case .Pop:
            break
        case .None:
            break
        }
        return nil
    }
}

现在,您可以完全控制UINavigationController转换了,您也可以试试这个

CATransition *transition = [CATransition animation];

transition.duration = 0.5;
transition.type = kCATransitionMoveIn;
transition.subtype = kCATransitionFromLeft;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

[self.navigationController.view.layer addAnimation:transition forKey:kCATransition];

DrawingResultsViewController *dr = [DrawingResultsViewController createAndShowProfile:YES];

[self.navigationController pushViewController:dr animated:YES];

如果有人在Xamarin.iOS中寻找相同的答案(基于答案),请尝试上述代码:


假设
myViewController
是您的视图控制器,将自定义转换传递到导航控制器层

CATransition *transition = [CATransition animation];

transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;

[self.navigationController.view.layer addAnimation:transition forKey:@"pushViewController"]; 

[self.navigationController pushViewController:myViewController animated:NO];
对于Swift 4.0+

1-创建扩展名:

extension UINavigationController {
    func customPopView(_ viewController: UIViewController) {
        let transition: CATransition = CATransition()
        transition.duration = 0.3
        transition.type = CATransitionType.push
        transition.subtype = CATransitionSubtype.fromLeft
        view.layer.add(transition, forKey: nil)
        pushViewController(viewController, animated: false)
    }
}
self.navigationController?.customPopView(yourViewController)
2-呼叫:

extension UINavigationController {
    func customPopView(_ viewController: UIViewController) {
        let transition: CATransition = CATransition()
        transition.duration = 0.3
        transition.type = CATransitionType.push
        transition.subtype = CATransitionSubtype.fromLeft
        view.layer.add(transition, forKey: nil)
        pushViewController(viewController, animated: false)
    }
}
self.navigationController?.customPopView(yourViewController)

尝试这样做:
[self.view.window.layer addAnimation:transition-forKey:nil]而不是:
[self.view.layer addAnimation:transition-forKey:nil]谢谢你。我会试试。您可以在appDelegate中使用
required init
创建一个
UINavigationController
对象。但是AppDelegate本身没有
UINavigationController
对象。您是否只需声明实例,然后根据VC对其进行初始化,并设置单个视图控制器的
UINavigationController
对象?@cococoutch您使用根视图控制器在应用程序委托中创建导航控制器,然后实例化协调控制器。。。或者,您可以将导航控制器划分为子类,并成为其委托人。最后,我声明了变量,并在App委托中将
UIViewController
导航控制器对象按每个视图控制器传递给它。因为故事板。不管怎么说,它是有效的。。谢谢谢谢找到如何在pushViewController中使用动画转换需要一些时间。需要从左滑动,而不是Flip对于RTL语言,例如阿拉伯语,当iOS语言从iPhone/iPad设置更改时,iOS将自动执行此操作。这对我来说很有效,但与正常推送相比,它看起来有点古怪,我得到一些奇怪的黑色背景的过渡,是不存在的正常推动。
CATransition *transition = [CATransition animation];

transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;

[self.navigationController.view.layer addAnimation:transition forKey:@"pushViewController"]; 

[self.navigationController pushViewController:myViewController animated:NO];
extension UINavigationController {
    func customPopView(_ viewController: UIViewController) {
        let transition: CATransition = CATransition()
        transition.duration = 0.3
        transition.type = CATransitionType.push
        transition.subtype = CATransitionSubtype.fromLeft
        view.layer.add(transition, forKey: nil)
        pushViewController(viewController, animated: false)
    }
}
self.navigationController?.customPopView(yourViewController)