How to prevent UINavigationBar from covering top of view in iOS 7?

早过忘川 提交于 2019-11-26 23:21:53

Set the navigation bar's translucent property to NO:

self.navigationController.navigationBar.translucent = NO;

This will fix the view from being framed underneath the navigation bar and status bar.

If you have to show and hide the navigation bar, then use

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

in your viewDidLoad method.

Sumit Mundra

In iOS 7 by defaults all Controller translucent property value is YES, so you set translucent property NO for this issue.

self.navController.navigationBar.translucent = NO;

You can disable the "Extend edges" in Attribute inspector of View Controller of this screen (as shown in below image) :

uplearnedu.com

This works for swift as well on iOS 8.1

navigationController?.navigationBar.translucent = false

If you want to keep the translucency on your navigationBar, at the end of your viewDidLoad or in your viewWillAppear add this line of code:

[self.view sendSubviewToBack:self.tableView]

Somehow if your scrollView subclass (UITableView, UICollectionView, etc.) is at index 0 in your current view subviews, it will automatically adjust the insets according to your navigationBar. And it shouldn't affect your UI in versions prior to iOS7 either.


EDIT If you initialize your UITableView programmatically, then it is best to add it to the view using this [self.view insertSubview:self.tableView atIndex:0];

Swift 4:

Set following line of code in viewDidLoad method:

self.navigationController?.navigationBar.isTranslucent = false

You can add this method into your view controller as shown on this URL:

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

Another approach is to set self.automaticallyAdjustsScrollViewInsets = YES; on your view controller. This is enabled by default. But in your case:

I see you are using EGORefreshHeaderView. It plays with contentInset of UITableView. So when you release it, header will reset top inset instead of restore previous value.

The above answers might fix your issue but rise many other issues, for instance: Custom views are not centered by Y because navigation bar becomes opaque hence it pushes down all your views.

Having translucent navigation bar doesn't cause this issue neither it causes the issue you posted about in iOS 11+. However I found no workaround to have it work on all iOS platforms starting from iOS 9.

If you want to have complete control on views and avoid faulty adjustments of iOS, subclass UITableView and adjust the insets (both scroll and indicators) in -(void)willMoveToWindow:(UIWindow *)newWindow. Works for me.

Nicoli

Another option is to open your Info.plist file in source code mode and enter the following info:

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

Hope this helps.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!