【问题标题】:Navigation bar jumps out from under status bar?导航栏从状态栏下跳出来?
【发布时间】:2013-11-19 20:12:58
【问题描述】:

我的主视图控制器中有一个按钮,它使用 segue 推送带有嵌入式视图控制器的导航控制器。

当新的视图控制器出现时,它上面的导航栏会短暂地出现在状态栏的下方。 (状态栏未隐藏。)内容(相对于顶部布局指南)位于正确的位置。动画一完成,它就会自行修复。

当视图再次关闭时,同样的事情会发生:主视图控制器会短暂地覆盖状态栏。对于主视图控制器,这更重要一些,因为它基于UITableViewController;整个桌子都跳了起来。同样,当动画完成时,视图控制器会自行修复。

我尝试关闭导航栏上的半透明,但这只会让问题更加明显。所有这些都可以在 iOS 6 上按预期工作。

我在这里上传了一个极简测试用例:https://github.com/tewha/FlipTest

【问题讨论】:

    标签: ios uiviewcontroller ios7


    【解决方案1】:

    另一个简单的技巧是这样做:

    MasterViewController

    什么时候准备Segue:

     - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        [UIView transitionWithView:self.navigationController.view
                          duration:0.75
                           options:UIViewAnimationOptionTransitionFlipFromRight
                        animations:nil
                        completion:nil];
    }
    

    当展开 AboutViewController

    - (IBAction)aboutUnwind:(UIStoryboardSegue *)segue {
    
    [UIView transitionWithView:((UIViewController *)segue.sourceViewController).view
                      duration:0.75
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    animations:nil
                    completion:nil];
    

    }

    【讨论】:

    • 这真是个不错的技巧。谢谢。
    • Prepare for segue 在 'performSegueWithIdentifier:' 之后调用。您的故事板将触发过渡,并为 segue 做准备意味着最后一刻的更改。要使其成为更合法的解决方案,而不是 hack,您应该按照我在下面的建议进行操作。
    • 谢谢#robdashnash,我会检查你的评论和链接。
    【解决方案2】:

    这是iOS7布局系统的一个bug。我发现将导航控制器视图的高度(不是推送视图控制器的高度!)降低状态栏高度并将其放置在 y = 状态栏高度会有很大帮助,但状态栏的位置仍然会有一个小闪烁与导航控制器“合并”。

    顺便说一句,看看iOS7.1b1是否还存在这个bug。

    【讨论】:

    • 如果这真的是一个 iOS 错误,我想我会忍受它。它只是装饰性的,只要 Apple 包含修复程序,我的用户就会得到它。不过很烦人。 :)
    • 我将接受doorbatta 的回答,因为他的解决方法更简单。我想你可能也想看看它。 :) 但是谢谢。
    • 我知道这一点。对我没有帮助。
    • 为什么我的解决方法对您不起作用?你在使用 presentModal 吗?
    【解决方案3】:

    ios 7出现导航栏问题,导航栏出现在视图上方或显示导航栏和视图之间的间隙,您可以借助以下代码解决此问题

    iOS 7 中引入了一个新属性,可让您像以前的 iOS 版本一样调整布局行为。这段代码在你的视图控制器中,你应该很好导航栏占用的空间应该自动考虑

    if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
    

    答案来自iOS 7 navigation bar jumping / stretching upon viewDidAppear

    【讨论】:

      【解决方案4】:

      这是英国套件中的一个错误。避免使用标准方法

      'performSegueWithIdentifier' 或 'presentViewController'

      这里我从一个控制器转换到另一个,然后在委托回调中转换回,使用 UIView 转换动画。

      -(void)photoButtonPressed:(NSNotification*)notification
      {        
          UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Media"
                                                               bundle:nil];
      
          UINavigationController *navCon = [storyboard instantiateInitialViewController];
      
          PhotoCaptureViewController *controller = navCon.viewControllers.firstObject;
          controller.delegate = self;
      
          CustomTabBarViewController *tabBarController = (CustomTabBarViewController*)self.tabBarController;
      
          [UIView transitionWithView:self.navigationController.view duration:0.75 options:UIViewAnimationOptionTransitionFlipFromRight animations:^{
                              [tabBarController.parentViewController addChildViewController:navCon];
                              [tabBarController.parentViewController.view addSubview:navCon.view];
                          } completion:^(BOOL finished) {
                              [navCon didMoveToParentViewController:tabBarController.parentViewController];
                          }];
      }
      
      -(void)photoCaptureViewController:(PhotoCaptureViewController *)controller dismissButtonPressed:(UIButton *)dismissButton
      {
          CustomTabBarViewController *tabBarController = (CustomTabBarViewController*)self.tabBarController;
      
          [UIView transitionFromView:controller.navigationController.view toView:tabBarController.view duration:1 options:UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL finished) {
              [controller.navigationController willMoveToParentViewController:nil];
              [controller.navigationController removeFromParentViewController];
              [controller.navigationController.view removeFromSuperview];
          }];
      
      }
      

      这是一篇关于容器视图的精彩读物Khanlou's blog post

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-11
        • 2014-11-18
        • 1970-01-01
        相关资源
        最近更新 更多