过渡后的水平反弹

我正在为 iOS7更新我的应用程序,我发现了一个奇怪的问题。我呈现的是一个包装在 UINavigationController 中的带 UIModalTransitionStyleFlipHorizontal的 UIViewController。

在 iOS6中它工作得很好,但是在 iOS7中,导航条在转换之后会弹跳。这和状态栏有关吗?我已经将主导航栏的半透明度设置为 NO

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

下面是一个简单的演示应用程序中显示的问题的 GIF 图片:

enter image description here

这是我的代码:

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];
8134 次浏览

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

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];


[self.navigationController.navigationBar.layer removeAllAnimations];
}

(将其放置在转换 的视图控制器中)。

对我来说也是一样。实际上工作的方法是将样式改为 Cover竖直,看起来更加流畅。

我有同样的问题,可以“解决它”(这不是一个真正的解决问题的办法,但它看起来很好:)。技巧是使用带有 UIView动画的 ABC0/popViewController视图控制器进行翻转。下面是展示视图控制器的示例代码:

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]。我希望这个方法能帮到你。

为了解决现在和解散的这个问题,我使用 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上,并且设置 transtionDelegate:

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];
}

如果你不使用 autolayout,你需要将它添加到视图控制器中,你需要将 dismiss添加到:

- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];


[self.view setNeedsLayout];
}

对于呈现的视图控制器和呈现的视图控制器,我在 UINavigationController中都有一个 UITableViewController,它们都是使用 Auto Layout 配置的。我注意到,其他的答案并没有解决这个问题,即在解除表示视图控制器的 tableView 时,视图会垂直跳跃20个点。

这个解决方案解决了这个问题。

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

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

在呈现视图控制器中(部分是由于 Dusty 提出的) :

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