导航栏出现在新iOS7 SDK的视图上

CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame]; UISearchBar *mySearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)]; mySearchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ; UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)]; myTableView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; [self.view addSubview:mySearchBar]; [self.view addSubview:myTableView]; 

在早期的版本中,它工作正常。 search栏出现在statusbar和导航栏下方。 tableview出现在search栏下面

但是,当我在Xcode 5 sdk iOS 7上运行这个时,search栏是不可见的(我想它位于状态栏和导航栏下),导航栏也出现在表视图上。

它会被修复与iOS 7稳定版本?

或者是我的编码问题?

还是应该通过为iOS 7添加y (y = statubar height + nav bar height)值来处理它?

我最近下载了Xcode 5 DP来在iOS 7中testing我的应用程序。我注意到并确认的第一件事是我的视图的边界并不总是调整到状态栏和导航栏的大小。

在viewDidLayoutSubviews中,我打印视图的边界:

 {{0, 0}, {320, 568}} 

这导致我的内容出现在导航栏和状态栏的下面。

我知道我可以通过获得主屏幕的高度,减去状态栏的高度和导航栏的高度来解释高度,但是这似乎是不必要的额外工作。

有没有人遇到过这个问题?

更新:

我find了解决这个特定问题的方法。 将导航栏的半透明属性设置为NO:

 self.navigationController.navigationBar.translucent = NO; 

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

但是,我还没有find一个解决scheme,当你想导航栏是半透明的。 例如,全屏查看照片,我希望导航栏是半透明的,并且要将视图框在其下面。 这是有效的,但是当我切换显示/隐藏导航栏,我遇到了更奇怪的结果。 第一个子视图( UIScrollView )每次都会更改原点的边界。

这并不完全正确。 在iOS 7中引入了一个新属性,可以让您像以前版本的iOS一样调整布局行为。 把这段代码放在你的视图控制器中,你应该很好走! 导航栏占用的空间应该自动计算在内

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

您需要在-(void)viewDidLoad方法中添加上面的代码。

注意:由于API已经从beta版本更改,所以您应该使用iOS 7和Xcode 5的最新GM版本。

故事板截图

如果你正在Storyboard(我强烈推荐!)工作,这是解决scheme:你可以在故事板中禁用ViewController的“Extend Edges”。 你必须为每个viewController做这个。 您可以通过单击stortyboard中的viewController图标(除了视图本身下面的productOwner),然后select属性检查器(如图所示)来禁用扩展边。

这也将设置像iOS 6的alignment线。

xCode 5中的另一个伟大的工具是“预览”:点击pipe家button(助理编辑器)并select预览。 在那里你可以selectiOS 6,看看你的故事板devise将如何在iOS 6上看起来像。

它很棒:D

[更新]

小心:当应用程序在iOS7上进入背景时,禁用“延伸边缘”可能会导致导航栏上发黑。 在多任务视图中也会显示辉光(双击主屏幕button)。 这可以通过将导航条视图的背景颜色设置为白色来解决。

 [self.navigationController.view setBackgroundColor:[UIColor whiteColor]]; 

正如OP所说,有一个简单的解决scheme,这是设置导航栏是不透明的。 而不是在代码中执行此操作,只需将根目录导航栏的“半透明”

在这里输入图像说明

self.edgesForExtendedLayout=UIRectEdgeNone;

它适用于iOS 7模拟器(Xcode 5 DP5)

这些答案都是有用的,特别是MQoder的,但对我来说,我也必须将默认的顶部栏设置为“不透明的黑色导航”。

在这里输入图像说明

@One Man Crew的答案是正确的,但是:

我会build议使用此代码,以避免在旧版本上运行应用程序时出现错误:

  #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1 if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) self.edgesForExtendedLayout = UIRectEdgeNone; #endif 

self.edgesForExtendedLayout = UIRectEdgeNone;

而你需要在AppDelegate#application:didFinishLaunchingWithOptions上做到这一点:

self.window.backgroundColor = [UIColor whiteColor];

否则,导航栏的背景颜色将变为灰色。 因为透明的导航栏重叠窗口。

如果你想在用户滚动你的表格视图时保持透明度,你可以设置它的contentInset:

 CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height; self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0); 

一个解决scheme是使用导航控制器。 这自动解决了这个问题。 也使用Xcode 5而不是Xcode Preview版本,因为它们是beta版本。