iOS7 UIModalTransitionStyleFlipHorizo​​ntal在转换后反弹

我正在更新我的应用程序的iOS 7,我发现了一个奇怪的问题。 我用UIModalTransitionStyleFlipHorizontal呈现包裹在UINavigationController中的UIViewController。

在iOS 6中,它工作正常,但在iOS 7中,导航栏在转换后弹跳。 这是否与状态栏有关? 我已经将主导航栏的半透明设置为NO

在Info.plist中, 基于视图控制器的状态栏外观设置为NO。

这里是一个GIF显示在一个最小的演示应用程序的问题:

在这里输入图像说明

这是我的代码:

 feedNavigationController = [[UINavigationController alloc] init]; feedNavigationController.navigationBar.translucent = NO; SettingsViewController *settingsVC = [[SettingsViewController alloc] init]; feedNavigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [feedNavigationController setViewControllers:[NSArray arrayWithObjects:settingsVC, nil]]; [self presentViewController:feedNavigationController animated:YES completion:nil]; 

这似乎是一个UIKit错误。 下面的解决方法似乎为我解决了这个问题。

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController.navigationBar.layer removeAllAnimations]; } 

(把它放在你正在转换的视图控制器 )。

为了解决这个问题,我使用iOS7自定义转换。

添加到你的UIViewController:

 - (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source { return (id<UIViewControllerAnimatedTransitioning>)self; } - (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed { return (id<UIViewControllerAnimatedTransitioning>)self; } - (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext { return 0.7f; } - (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext { UIView *containerView = [transitionContext containerView]; UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; [containerView addSubview:fromVC.view]; UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; [containerView addSubview:toVC.view]; UIViewAnimationOptions animationOption = ([toVC.presentedViewController isEqual:fromVC])?UIViewAnimationOptionTransitionFlipFromLeft:UIViewAnimationOptionTransitionFlipFromRight; [UIView transitionFromView:fromVC.view toView:toVC.view duration:[self transitionDuration:transitionContext] options:animationOption completion:^(BOOL finished) { [transitionContext completeTransition:YES]; }]; } 

要使用它,你只需要检查你是否在iOS7上,并设置transitionDelegate:

 YourVCWithTheCustomTransition* yourVC = [[YourVCWithTheCustomTransition alloc] init]; CGFloat deviceVersion = [UIDevice currentDevice].systemVersion.floatValue; if(deviceVersion >= 7.0) [yourVC setTransitioningDelegate:yourVC]; [self presentModalViewController:yourVC animated:YES]; [yourVC release]; 

在我的情况下,我有一个自定义的UINavigationController自定义过渡定义:我不必每次都这样做。

这似乎是一个UIKit错误。 下面的解决方法似乎为我解决了这个问题。

presentViewController(把它放在你正在转换的视图控制器中):

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController.navigationBar.layer removeAllAnimations]; } 

dismissViewControllerAnimated(把这个放在视图控制器中):

 - (void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; [self.navigationController.navigationBar.layer removeAllAnimations]; } 

如果你不使用自动布局。 你需要把这个添加到你closures的视图控制器中:

 - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self.view setNeedsLayout]; } 

我有同样的问题,可以“解决”(这不是一个真正的解决scheme,但它看起来不错:))。 技巧是呈现视图控制器使用pushViewController / popViewController与UIViewanimation做翻转。 这里是一个示例代码来呈现视图控制器:

 UIViewController *viewController = [[UIViewController alloc] init]; [UIView transitionWithView:self.navigationController.view duration:0.5 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ [self.navigationController pushViewController:viewController animated:NO]; } completion:nil]; 

解雇它:

 [UIView transitionWithView:self.navigationController.view duration:0.5 options:UIViewAnimationOptionTransitionFlipFromRight animations:^{ [self.navigationController popViewControllerAnimated:NO]; } completion:nil]; 

如果你不想在推控制器上的navigationBar只是在viewWillAppear中调用[self.navigationController setNavigationBarHidden:YES animated:NO]。 我希望这种方法可以帮助你

对于呈现和呈现的视图控制器,我都有一个UINavigationControllerUITableViewController ,它们都是使用Auto Layoutconfiguration的。 我注意到其他的答案并没有解决当前视图控制器的tableView垂直跳转20pt的问题。

该解决scheme解决了这个问题

在呈现的视图控制器(由本·帕卡德提出)中:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController.navigationBar.layer removeAllAnimations]; } 

在呈现视图控制器中(部分由灰尘提出):

 - (void)viewWillLayoutSubviews{ if (self.navigationController.presentedViewController) { [self.navigationController.navigationBar.layer removeAllAnimations]; [self.tableView.layer removeAllAnimations]; } [super viewWillLayoutSubviews]; } 

我也一样。 实际上工作是将样式改为CoverVertical,看起来更平滑。