使用新的iOS7 SDK在视图上方显示导航栏

时间:2013-08-07 12:43:36

标签: iphone ios objective-c ipad ios7

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];

在早期版本中,它正常运行。搜索栏显示在statusbar和导航栏下方。 tableview出现在搜索栏下方

但是当我在Xcode 5 sdk iOS 7上运行时,搜索栏不可见(我认为它位于状态栏和导航栏下方),导航栏也出现在表格视图上。

是否可以通过iOS 7稳定版本修复?

或者是我的编码问题?

或者我们应该通过为(y = statubar height + nav bar height)添加y iOS 7值来处理它吗?

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

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

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

这会导致我的内容显示在导航栏和状态栏下方。

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

还有其他人遇到过这个问题吗?

更新

我找到了针对这个特定问题的解决方案。将导航栏的半透明属性设置为NO:

self.navigationController.navigationBar.translucent = NO;

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

但是,当您希望导航栏为半透明时,我还没有找到修复此案例的方法。例如,在全屏查看照片时,我希望导航栏是半透明的,并且要在其下方构建视图。这是有效的,但当我切换显示/隐藏导航栏时,我经历了甚至更奇怪的结果。第一个子视图(a UIScrollView)每次都会更改其边界y原点。

9 个答案:

答案 0 :(得分:188)

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

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

您需要在-(void)viewDidLoad方法中添加以上内容。

注意:由于API已从测试版发布,因此您应该使用iOS 7和Xcode 5的最新GM版本。

答案 1 :(得分:37)

Screenshot from storyboard

如果您正在使用Storyboard(我强烈推荐!),这就是解决方案: 您可以在storyboard中禁用ViewController的“Extend Edges”。您必须为每个viewController执行此操作。您可以通过单击stortyboard中的viewController图标(除了视图本身下面的productOwner)然后选择属性检查器(如图像显示)来禁用扩展边缘。

这也会设置像iOS 6一样的对齐线。

xCode 5中另一个很棒的工具是“预览”:点击管家按钮(助理编辑器)并选择预览。在那里你可以选择iOS 6,看看你的故事板设计在iOS 6上的样子。

它很棒:D

[更新]

注意:当应用程序在iOS7上进入后台时,禁用“延伸边缘”可能会导致导航栏上出现黑光。在多任务视图上也可以看到发光(双击主页按钮)。这可以通过将导航栏视图的背景颜色设置为白色来解决。

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

答案 2 :(得分:12)

正如OP所说,有一个简单的解决方案就是将导航栏设置为不透明。而不是在代码中执行此操作,只需为根导航栏取消“半透明”:

enter image description here

答案 3 :(得分:8)

self.edgesForExtendedLayout=UIRectEdgeNone;

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

答案 4 :(得分:2)

这些答案都很有帮助,尤其是MQoder,但对我来说,我还必须将默认顶栏设置为“不透明的黑色导航”。

enter image description here

答案 5 :(得分:1)

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

我建议使用此代码以避免在旧版本上运行应用时出错:

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

答案 6 :(得分:0)

  

self.edgesForExtendedLayout = UIRectEdgeNone;

你需要在AppDelegate#application上执行此操作:didFinishLaunchingWithOptions:

  

self.window.backgroundColor = [UIColor whiteColor];

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:-1)

一种解决方案是使用导航控制器。这会自动解决问题。 也可以使用Xcode 5而不是Xcode Preview版本,因为它们是beta版本。