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


99

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

全部内容 所有内容均处于空闲状态

有人知道我该如何解决吗?

编辑:我尝试过此以前的建议:

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

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

解决方案尝试

这可能是因为由于导航栏的透明性,我在此视图控制器下显示了一个“幻灯片菜单”。


这里是解决此问题的另一种方法。stackoverflow.com/a/51491645/10148333
Afonso

Answers:


234

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

self.navigationController.navigationBar.translucent = NO;

这样可以防止视图被框在导航栏和状态栏的下面。

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

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

用你的viewDidLoad方法。


1
我把viewDidLoad它放在下面,但是它没有变化。
山姆D20 2013年

13
使其在viewDidLayoutSubviews功能中
印度

1
将其附加到viewDidLayoutSubviews可以达到目的。我感谢先生们的帮助!
山姆D20 2013年

嗨,有什么问题吗?还是恭维?
2013年

1
self.edgesForExtendedLayout = UIRectEdgeNone; 帮助了我
幸运的

32

iOS 7通过默认所有控制器半透明的属性值是YES,那么你没有设置透光性这个问题。

self.navController.navigationBar.translucent = NO;

2
没有“ navController”属性。使用此方法:self.navigationController.navigationBar.translucent = NO;
Gene Z. Ragan

我在应用程序委托中创建navigtionbarcontroller对象,并命名为navController。
Sumit Mundra '16

21

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

在此处输入图片说明


12

在iOS 8.1上也可以快速运行

navigationController?.navigationBar.translucent = false

8

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

[self.view sendSubviewToBack:self.tableView]

不知何故,如果您的scrollView子类(UITableViewUICollectionView等)index在当前视图中为0 subviews,它将根据您的自动调整插图navigationBar。而且它也不应该影响iOS7之前的版本中的用户界面。


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


这应该是正确的答案。如果要以编程方式添加子视图,则可以执行此操作,[self.view insertSubview:self.tableView atIndex:0];而不是在添加后将其发送到背面。
smitt0​​4 2014年

正确。但是,在不知道他是如何启动控制器(以编程方式,界面生成器)的情况下,我们不能认为这是最好的解决方案。尽管我已经编辑了答案。
jbouaziz 2014年

这行得通,但看起来像黑客。官方文档中对此有任何通知吗?
约翰·特雷西

4

斯威夫特4

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

self.navigationController?.navigationBar.isTranslucent = false

3

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

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

2

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

我看到您正在使用EGORefreshHeaderView。它与UITableView的contentInset一起玩。因此,释放它时,标头将重置顶部插图,而不是还原先前的值。


-1

如果要完全控制视图并避免对iOS进行错误调整,请对UITableView进行子类化,并在-(void)willMoveToWindow:(UIWindow *)newWindow中调整插入项(滚动和指示器)。为我工作。


-4

另一个选择是在源代码模式下打开Info.plist文件,然后输入以下信息:

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

希望这可以帮助。


1
我认为这根本不会影响视图。
Enrico Susatyo 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.