10

我开始在故事板中使用 TableViewController 在我的应用程序中构建 TableView。当你这样做时,当你向下滚动你的列表时,你会得到一个非常酷的效果:在导航栏后面移动的单元格变得模糊。

一段时间后,我不得不从这个 TableViewController 移动到一个带有 TableView 的 ViewController(我必须在表格底部添加其他视图)。

为了避免第一个单元格被导航栏隐藏(在它上方),我在顶部和底部布局指南以及视图的左右边缘添加了约束。

这很好用,但我失去了酷炫的模糊滚动效果:在导航栏后面之前,单元格似乎正在消失。

我已经看到人们不使用约束并将幻数放入界面构建器中的解决方法。我不能这样做,首先是因为我不喜欢它,其次是因为我必须兼容 iOS 6。

我错过了什么能够再次从模糊的导航栏效果中受益?

4

5 回答 5

11

您必须手动调整contentInset表格视图并确保表格视图框架原点为 0、0。这样表格视图将位于导航栏下方,但内容和滚动视图边缘之间会有一些边距(内容被向下移动)。

我建议你使用topLayoutGuide视图控制器的属性来设置 right contentInsets,而不是硬编码 64 (状态栏+导航栏)。还有bottomLayoutGuide,您应该在UITapBars 的情况下使用它。

这是一些示例代码(viewDidLoad应该没问题):

// Set edge insets
CGFloat topLayoutGuide = self.topLayoutGuide.length;
tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);

顺便说一句,这个属性UIViewController可能会对您有所帮助(您不需要更改它们的默认值,但我不知道您的视图层次结构是什么):

  • automaticallyAdjustsScrollViewInsets
  • edgesForExtendedLayout
  • extendedLayoutIncludesOpaqueBars
于 2013-10-15T19:50:46.627 回答
2

tableView 需要全屏显示。那是在顶部和底部栏的下方。注意不要使用顶部和底部布局指南,因为它们用于相对于不在下方的栏进行定位。

然后需要手动设置tableview的content inset。这会将初始滚动位置设置在顶栏下方。

就像是:

CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
CGFloat h=MIN(statusBarSize.width, statusBarSize.height);
UIEdgeInsets e = UIEdgeInsetsMake(self.navigationController.navigationBar.bounds.size.height + h,
                                             0.0f,
                                             0.0f,
                                             0.0f);

self.tableView.contentInset = e;

使用 tableView 控制器和“自动调整内容插入”设置时,您不会免费获得此功能

于 2013-10-28T01:11:53.303 回答
1

UIViewController 属性edgesForExtendedLayout可以解决问题。如果您使用情节提要,只需确保Extended Edges Under Top Bars打开(默认情况下)。如果您以编程方式创建视图控制器,请尝试以下操作:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.edgesForExtendedLayout = UIRectEdgeAll;
}

当然,您的表格视图需要具有适当的自动调整掩码/布局约束

于 2013-10-10T15:09:06.353 回答
1

您可能将tableView未设置的坐标(0, 0)映射到viewController.view.frameor的坐标viewController.view.bounds。如果你这样做了,请尝试设置

self.navigationController.navigationBar.translucent = YES;

于 2013-10-10T15:13:32.397 回答
0

edgesForExtendedLayout 不是您想要的,因为这会限制导航栏下方的表格视图。在 iOS 7 中,视图控制器默认使用全屏,控制 tableview 内容从哪里开始的属性是自动调整滚动视图插入。默认情况下这应该是 YES,因此请检查它是否以某种方式设置为 NO,或者尝试显式设置它。

检查此答案以获得有关其工作原理的良好解释: https ://stackoverflow.com/a/19585104/1485715

于 2013-10-27T14:17:07.017 回答