如何在使用 iOS7 的 UINavigationBar 时以编程方式定位 UITableView?

Posted

技术标签:

【中文标题】如何在使用 iOS7 的 UINavigationBar 时以编程方式定位 UITableView?【英文标题】:How do I position UITableView programmatically while using iOS7's UINavigationBar? 【发布时间】:2013-12-13 20:54:15 【问题描述】:

我有一个相当常规的UIViewController,它是UINavigationController-hierarchy 的一部分,这自然使视图顶部有一个UINavigationBar。众所周知,ios7的导航栏与之前的版本有很大的不同。

如果我将 UITableView 拖到 Storyboard 中的视图中,则表格视图的“框架”将覆盖整个视图(即 [tableView setFrame:self.view.frame];)。甚至在NavigationBar 后面。 这使得如果我滚动,内容将通过栏隐约可见。 与大多数人相反,我其实很喜欢这个。

在我当前的视图控制器中,我想以编程方式创建UITableView 并将其作为子视图放置在这里。但是,我无法通过这种方式达到相同的效果。

我试过了

UITableView *table = [[UITableView alloc] initWithFrame:self.view.frame];
[self.view addSubview: table];

这使得“顶部滚动点”保持在导航栏的后面。想象一下 tableView 中的单个单元格,通过顶栏隐约可见。如果我向下滚动,它会在它后面弹出。这是默认的“顶部位置”。

我也试过

CGRect frame = CGRectMake(0, 'nav.y+nav.height', self...width, self...height-y);    
UITableView *table = [[UITableView alloc] initWithFrame:frame];
[self.view addSubview: table];

简单地将表格视图放在UINavigationBar 下方的矩形中,但是我不会在栏后面获得滚动透明效果。

我还尝试了第一个示例:

[tableView setContentOffset:CGPointMake(0, 'below navbar')];

这使它准确地停留在我希望它停留的位置,但是一旦我触摸它(滚动和释放),它就会在导航栏后面向上滚动并停留在那里。

实现这种效果的程序化解决方案是什么?每次向上滚动时都必须设置偏移量,还是有更简单的解决方案?除了这种 iOS7 风格,我想他们会添加类似 [tableView setVisibleFrame:] 之类的东西..?

【问题讨论】:

【参考方案1】:

像往常一样在情节提要中添加表格,但请确保已将其连接到插座(我们现在将其称为 _tableView)。

然后在您的视图控制器的-viewDidLoad 中将顶部插图设置为状态栏和导航栏:

`self.tableView.contentInset = UIEdgeInsetsMake((self.navigationController.navigationBar.frame.origin.y + self.navigationController.navigationBar.frame.size.height), 0, 0, 0);'

这将确保所有单元格都可见,但也会用白色填充导航栏后面的区域,这样导航栏就不会变成灰色。

【讨论】:

啊,谢谢。我以前从未听说过inset 这个词,但这正是我想要的。作为记录,该问题直接针对以编程方式创建 tableView,而不是通过 Storyboard 添加和使用 Outlets。无论如何,您在我的第一个“示例”之后的代码行就成功了,谢谢。

以上是关于如何在使用 iOS7 的 UINavigationBar 时以编程方式定位 UITableView?的主要内容,如果未能解决你的问题,请参考以下文章

使用 UINavigation 保存后如何返回?

如何将按钮添加到 UINavigation 项?

如何在 UINavigation 中显示 UISearchBar?

如何更改 UINavigation leftBarButtonItem 的颜色

在两个 UITableView 之间转换时如何模仿 UINavigation 动画行为

iOS学习之UINavigationController