如何防止 UINavigationBar 在 iOS 7 中覆盖视图顶部?

Posted

技术标签:

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

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

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

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

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

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

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

【问题讨论】:

这是解决此问题的另一种方法。 ***.com/a/51491645/10148333 【参考方案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

【讨论】:

以上是关于如何防止 UINavigationBar 在 iOS 7 中覆盖视图顶部?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止在 UINavigationbar 上同时触摸按钮的双重动作?

如何防止黑色背景出现在我的UINavigationBar中?

如何防止在横向上自动调整 UINavigationBar 的大小

防止 UISearchBarController 显示 UINavigationBar

IOS5中如何自定义UINavigationBar

如何在中间对齐自定义 UINavigationBar 标题(UILabel)(iOS)