UITableView contentOffset 行为异常

Posted

技术标签:

【中文标题】UITableView contentOffset 行为异常【英文标题】:UITableView contentOffset behaving oddly 【发布时间】:2014-01-26 02:26:16 【问题描述】:

我有一个 UIViewController,它有多个从屏幕外输入的 UIView。我没有在 UIViewController 中初始化和设计所有这些 UIView,而是创建了单独的 nib 文件以及相应的 .h/.m 文件,这些文件刚刚被预加载。

在其中一个自定义 UIView 中,我有一个带有标题 UIView 的 UITableView。我试图将这个标题隐藏在我在原始 UIViewController 中的另一个组件下,这个 UIView 将滑入。我最初使用 [self.tableView setContentOffset:CGPointMake(0, 44) animated:NO]; 的示例项目解决了这个问题,但这只是在 UITableViewController 中。

由于某种原因,这不适用于子类 UIView。我已经尝试在- (id)initWithCoder:(NSCoder *)aDecoder- (void)layoutSubviews 中设置tableView 的内容偏移量,并且我一直在检查偏移量是否实际上是由

tableView:cellForRowAtIndexPath: 中设置的
NSLog(@"tableView Content Offset: %@", NSStringFromCGPoint(self.tableView.contentOffset));

但它只是返回

tableView Content Offset: 0, 0

有趣的是,如果我在tableView:cellForRowAtIndexPath: 中设置 contentOffset,它就可以工作!但我知道我不应该把它放在那里。有人可以向我解释从自定义 nib 加载 UITableView 时我应该在哪里以及如何实现这个,它只是一个子类 UIView?如果您认为有帮助,我可以发布所有代码。

其他信息: 问题:你是如何从 nib 加载视图的? – MAB

UIView *newView = [[[NSBundle mainBundle] loadNibNamed:@"ProfileCostTableViewController" owner:self options:nil] objectAtIndex:0];

【问题讨论】:

尝试在viewWillLayoutSubviews中设置 viewWillLayoutSubviews 在子类化 UIView 时不会被调用。我试图让它在子类 UIView 中工作,而不是 UIViewController 【参考方案1】:

我对 UITableView 进行了子类化,以查看 contentOffset 何时恢复到 0,0。似乎它是从私有方法在 ios7 中调用的:_adjustContentOffsetIfNecessary。由于没有记录这种方法,我看不到如何防止它改变偏移量,所以我认为解决方法是在延迟后或在- (int) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 中改变偏移量。

【讨论】:

我会尝试延迟,但看起来很老套。 contentOffset 重置为 0, 0 非常奇怪。不幸的是,设置 contentOffset 在tableView:numberOfRowsInSection 中也不起作用。到目前为止,它仅在 tableView:titleForHeaderInSection:tableView:cellForRowAtIndexPath: 中有效 所以,[self performSelector:@selector(setContentOffset) withObject:nil afterDelay:0.0] 确实有效!我可以将它设置在我最初想要的initWithCoder 中。我会将此标记为正确,唯一需要注意的是,您可以暂时看到我试图隐藏的内容,该内容在调用该方法时会捕捉到正确的偏移量。看起来有点时髦,但现在已经足够了。【参考方案2】:

您正在使用触发方法的addSubview: 添加您的视图:- (void)willMoveToSuperview:(UIView *)newSuperview 我认为如果您将代码放在那里,它应该可以工作。

【讨论】:

试过了,还是不行。在tableView:cellForRowAtIndexPath: 中记录 tableView 的 contentOffset 仍会输出 0, 0。由于某种原因,它被重置为 0。 你是如何从笔尖加载视图的?

以上是关于UITableView contentOffset 行为异常的主要内容,如果未能解决你的问题,请参考以下文章

UITableView contentOffSet 无法正常工作

UITableView ContentInset 和 ContentOffset

UIScrollView 滚动后 UITableView contentOffset 重置

具有自调整大小 insertRowsAtIndexPaths 的 UITableView 更改 contentOffset

带有 uisearchDisplayController 的 UItableView 在 ios 7 中滚动时更改了 contentoffset

更改 UITableView 的 contentInset 而不更改其 contentOffset?