如何防止 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
上保持半透明,请在 viewDidLoad
或 viewWillAppear
的末尾添加以下代码行:
[self.view sendSubviewToBack:self.tableView]
不知何故,如果您的scrollView
子类(UITableView
、UICollectionView
等)在当前视图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 的大小