如何在使用 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 中显示 UISearchBar?
如何更改 UINavigation leftBarButtonItem 的颜色