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

在更新到Xcode 5之后,我的所有应用程序视图中的导航栏都向下移动。 这里有一些截图,第一个显示视图中的所有内容,第二个显示所有内容。 search栏应该从导航栏的位置开始。

所有内容在空闲的所有内容

任何人都知道我可以解决这个问题?

编辑:我已经尝试过以前的build议:

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

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

解决方案尝试

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

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

 self.navigationController.navigationBar.translucent = NO; 

这将修复导航栏和状态栏下面的视图。

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

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

在你的viewDidLoad方法中。

iOS 7 ,默认情况下, 所有控制器半透明属性值均为YES,因此您为此问题设置了半透明属性NO

 self.navController.navigationBar.translucent = NO; 

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

在这里输入图像说明

这适用于iOS 8.1的swift

 navigationController?.navigationBar.translucent = false; 

如果你想保持你的navigationBar ,在你的viewDidLoadviewWillAppear结束的半透明添加这行代码:

 [self.view sendSubviewToBack:self.tableView] 

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

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

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

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

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

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

Swift 4

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

 self.navigationController?.navigationBar.isTranslucent = false 

如果你想完全控制视图,并避免错误的iOS调整,UITableView的子类,并调整 – (void)willMoveToWindow:(UIWindow *)newWindow中的插入(滚动和指标)。 为我工作。

另一个select是在源代码模式下打开Info.plist文件并input以下信息:

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

希望这可以帮助。