【问题标题】:.view Property of UITableViewController and UICollectionViewControllerUITableViewController 和 UICollectionViewController 的 .view 属性
【发布时间】:2014-05-13 19:34:08
【问题描述】:

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

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

感谢您的帮助。

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

【问题讨论】:

  • 您需要做同样的事情 - 处理滚动视图委托方法并在表格滚动时不断更新子视图的位置。
  • @maddy 但是在集合视图中,我不需要更新子视图的位置。我在添加视图时设置了一次,滚动时它从不移动。

标签: ios uitableview uiviewcontroller uicollectionview


【解决方案1】:

UITableViewController 中的self.viewUITableView,因为 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 的超级视图,而不是滚动视图本身。

UICollectionViewController 中没有发生这种情况的原因是,self.view 实际上是一个 UICollectionViewControllerWrapperView 对象。这是一个私有类,但从它的名字来看,我假设它是一个包装了UICollectionViewUIView

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

如果您不想添加子视图控制器,那么另一种选择是像您所说的那样,创建一个 UIViewController 子类并将您的分隔视图和 tableView 添加为视图控制器视图中的子视图但是如果您不要使用UITableViewController,你会失去额外的功能,比如自动调整 tableView 的 contentInsets 以适应键盘外观等。

【讨论】:

  • 我可以在我的UICollectionViewController 中添加一个子视图到self.view 并且它不会滚动,这似乎很奇怪。这是不一致的。我认为我的解决方案就像我在问题中所说的那样。将表视图和分隔视图添加到符合表视图协议的UIViewController 子类。感谢您的回复。
  • 我已经更新了我的答案,为您提供了更好的解释
  • 啊,谢谢。现在我明白为什么他们的行为不同了。另外,感谢您解释为什么我的方法不理想并且我会失去功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
相关资源
最近更新 更多