.view UITableViewController和UICollectionViewController的属性

时间:2014-05-13 19:34:09

标签: ios uitableview uiviewcontroller uicollectionview

我正在尝试将UIView *separatorView添加到我的收藏视图和表格视图的顶部,这些视图会在相应视图contentOffset.y > 0时显示。我通过在viewDidLayoutSubviews中添加视图并将其添加到self.view,在我的收藏视图上完成了这项工作。然后通过使用一些滚动视图委托方法,我可以使它显示和隐藏。这很好用但是对于表视图,如果我使用相同的概念,则separatorView会与表视图一起滚动。我仍然将separatorView添加到self.view,但它的行为与集合视图上的行为不同。我没有希望separatorView滚动。我希望它保持在顶部。我是否正确地认为使表格视图工作的方法是子类UIViewController并管理其中的表视图以及separatorView?有没有办法让它在我当前的UITableViewController子类中工作?

基本上,为什么self.view滚动表视图而不是集合视图?这似乎不一致。

感谢您的帮助。

编辑:添加图片以展示想法。

enter image description here

1 个答案:

答案 0 :(得分:3)

self.view中的

UITableViewControllerUITableView,因为tableViewController会覆盖视图控制器上的loadView

如果您运行以下代码:

UITableViewController *tableViewController = [[UITableViewController alloc] init];

NSLog(@"%@",tableViewController.view);

您将获得以下控制台输出:

2014-05-13 21:19:02.823 Test[28681:60b] <UITableView: 0x109834200; frame = (0 20; 320 548); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x109548f00>; layer = <CALayer: 0x109548c40>; contentOffset: {0, 0}>

如您所见,self.view不是UIView,而是UITableView。您的分隔符视图使用tableView滚动,因为调用:

[self.view addSubview:separatorView];

与调用完全相同:

[self.tableView addSubview:separatorView];

如果您希望分隔符保持在固定位置,则需要将其添加到tableView / collectionView的superview中,而不是滚动视图本身。

UICollectionViewController中未发生这种情况的原因是因为self.view实际上是UICollectionViewControllerWrapperView个对象。这是一个私人类,但从名称来看,我假设它是一个包裹UIView的{​​{1}}。

实现您想要的最明智的方法是使用custom container view (child view controller),它是包含分隔符视图和tableView / collectionView控制器的UICollectionView子类。

如果您不想添加子视图控制器,那么另一种选择就是像您说的那样,创建一个UIViewController子类并在视图控制器视图中添加分隔符视图和tableView作为子视图如果您不使用UIViewController,则会失去奖励功能,例如自动调整tableView的contentInsets以获得键盘外观等。