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