【问题标题】:How to prevent UINavigationBar from covering top of view in iOS 7?如何防止 UINavigationBar 在 iOS 7 中覆盖视图顶部?
【发布时间】:2013-09-28 00:15:04
【问题描述】:

更新到 Xcode 5 后,我所有应用视图中的导航栏都向下移动了。这是一些屏幕截图,第一个显示视图被下拉时的所有内容,第二个显示所有未触及的内容。搜索栏应该从导航栏开始。

有人知道我该如何解决这个问题吗?

编辑:我以前尝试过这个建议:

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

但它会产生非常奇怪的结果。

这可能是因为我在这个视图控制器下有一个“幻灯片菜单”,由于导航栏的透明度而出现。

【问题讨论】:

标签: ios objective-c ios7 uinavigationbar uistatusbar


【解决方案1】:

iOS 7中默认所有Controller的半透明属性值为YES,所以你为这个问题设置半透明属性NO

self.navController.navigationBar.translucent = NO;

【讨论】:

  • 没有“navController”属性。使用这个:self.navigationController.navigationBar.translucent = NO;
  • 我在应用委托中创建 navigtionbarcontroller 对象并命名为 navController。
【解决方案2】:

导航栏的半透明属性设置为NO

self.navigationController.navigationBar.translucent = NO;

这将修复视图在导航栏和状态栏下方的框架。

如果必须显示和隐藏导航栏,请使用

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

在您的 viewDidLoad 方法中。

【讨论】:

  • 我已经把它放在viewDidLoad 下但是它没有产生任何变化。
  • 在 viewDidLayoutSubviews 函数中制作
  • 将其附加到 viewDidLayoutSubviews 就可以了。感谢各位大侠的帮助!
  • 嗨,有什么问题吗?还是恭维?
  • self.edgesForExtendedLayout = UIRectEdgeNone;帮助了我
【解决方案3】:

另一种选择是以源代码模式打开您的 Info.plist 文件并输入以下信息:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarHidden</key>
<true/>

希望这会有所帮助。

【讨论】:

  • 我认为这根本不会影响视图。
【解决方案4】:

您可以将此方法添加到您的视图控制器中,如URL 所示:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.searchBar.frame = 
    CGRectMake(0, self.topOfViewOffset, self.searchBar.frame.size.width, self.searchBar.frame.size.height);
}

【讨论】:

    【解决方案5】:

    如果您想在 navigationBar 上保持半透明,请在 viewDidLoadviewWillAppear 的末尾添加以下代码行:

    [self.view sendSubviewToBack:self.tableView]
    

    不知何故,如果您的scrollView 子类(UITableViewUICollectionView 等)在当前视图subviews 中位于index 0,它会根据您的navigationBar 自动调整插图。它也不应该影响您在 iOS7 之前的版本中的 UI。


    编辑 如果您以编程方式初始化 UITableView,那么最好使用此 [self.view insertSubview:self.tableView atIndex:0]; 将其添加到视图中

    【讨论】:

    • 这应该是正确的答案。如果您以编程方式添加子视图,则只需执行 [self.view insertSubview:self.tableView atIndex:0]; 而不是在添加后将其发送到后面。
    • 正确。但是在不知道他如何启动他的控制器(以编程方式,界面构建器)的情况下,我们不能假设它是最好的解决方案。虽然我已经编辑了我的答案。
    • 这可行,但看起来像一个黑客。官方文档中是否对此有任何通知?
    【解决方案6】:

    另一种方法是在您的视图控制器上设置self.automaticallyAdjustsScrollViewInsets = YES;。 这是默认启用的。但在你的情况下:

    我看到您正在使用 EGORefreshHeaderView。它与 UITableView 的 contentInset 一起播放。所以当你释放它时,header 将重置顶部插入而不是恢复以前的值。

    【讨论】:

      【解决方案7】:

      如果您想完全控制视图并避免对 iOS 进行错误调整,请将 UITableView 子类化并调整 -(void)willMoveToWindow:(UIWindow *)newWindow 中的插图(滚动和指示器)。对我有用。

      【讨论】:

        【解决方案8】:

        这在 iOS 8.1 上也适用于 swift

        navigationController?.navigationBar.translucent = false
        

        【讨论】:

          【解决方案9】:

          您可以禁用 此屏幕视图控制器的属性检查器中的“扩展边缘”(如下图所示) :

          【讨论】:

            【解决方案10】:

            Swift 4

            在 viewDidLoad 方法中设置以下代码行:

            self.navigationController?.navigationBar.isTranslucent = false
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-07-23
              • 1970-01-01
              • 1970-01-01
              • 2014-05-27
              • 1970-01-01
              • 2015-10-24
              • 1970-01-01
              • 2017-03-24
              相关资源
              最近更新 更多