UITableViewController 使用大表页脚滚动太远
Posted
技术标签:
【中文标题】UITableViewController 使用大表页脚滚动太远【英文标题】:UITableViewController scrolls too far with large table footer 【发布时间】:2011-08-28 17:36:53 【问题描述】:我有一个 UITableViewController
子类用于输入我的应用程序的设置。我将自定义按钮添加到表页脚,方法是将它们添加到我在调用 tableView:viewForFooterInSection: 时返回的视图中。
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
CGRect viewRect = self.view.bounds;
float height = _settings.isNew ? 50.0 : 110.0;
float margin = (viewRect.size.width > 480.0) ? 44.0 : 10.0;
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, viewRect.size.width, height)];
GradientButton* button = [[GradientButton alloc] initWithFrame:CGRectMake(margin, 5, viewRect.size.width - margin * 2, 44)];
[view addSubview:button];
[button addTarget:self action:@selector(testConnectionClicked:) forControlEvents:UIControlEventTouchUpInside];
[button release];
if (!_settings.isNew)
// I add another button
return [view autorelease];
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
return _settings.isNew ? 50 : 110;
从 UITableViewController 子类化的重点是避免在键盘出现时让单元格滚动到视图中的问题。
这基本上可以正常工作,但是当编辑移动到最后一个单元格时,它似乎试图将表格页脚滚动到视图中。这意味着当在 iPhone 上以横向视图时,它实际上会将编辑文本字段滚动到视图之外。
【问题讨论】:
【参考方案1】:我通过在tableviewcontroller
的tableview
下方添加一个额外的UIView
解决了这个问题,而不是在我最后一个tableview
部分的页脚中设置一些文本。
如果您希望在多个部分中使用该页脚,这当然不能解决您的问题。
【讨论】:
【参考方案2】:从@ben-packard 的回答中得到提示,我发现UITableViewController
自动滚动并没有错;实际上是UITableView
的-scrollToRowAtIndexPath:atScrollPosition:animated:
导致视图滚动得太远。我不得不想象这种行为是故意的,即使它没有记录在案,但无论如何我们都可以通过继承 UITableView
并覆盖该方法来修复它:
- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated
if (scrollPosition == UITableViewScrollPositionNone)
[self scrollRectToVisible:[self rectForRowAtIndexPath:indexPath] animated:animated];
else
[super scrollToRowAtIndexPath:indexPath atScrollPosition:scrollPosition animated:animated];
【讨论】:
【参考方案3】:你实现tableView:heightForFooterInSection
了吗?听起来这可能是问题所在。如果你实现了tableView:viewForFooterInSection
,你还必须实现tableView:heightForFooterInSection
。
【讨论】:
【参考方案4】:我怀疑问题在于您在键盘上滚动的实现,但您没有发布任何代码。
当你做一些显示键盘的事情时,你为什么不做类似scrollToRowAtIndexPath:atScrollPosition:animated:
的事情,而不是继承一个UITableView?我找到了一个类似的thread here。
【讨论】:
我自己没有实现任何滚动,因为这是在 UITableViewController 中自动完成的——请注意,我不是 UITableView 的子类,而是 UITableViewController 的子类。这是根据您提到的线程中 Sam Ho 的回答完成的。我已经尝试了该线程中的大多数解决方案但没有成功,这就是我切换到 UITableViewController 的原因。【参考方案5】:我发现滚动到矩形(即使它来自同一行)似乎有效:
CGRect rect = [myTableView rectForRowAtIndexPath:myIndexPath];
[myTableView scrollRectToVisible:rect animated:YES];
【讨论】:
以上是关于UITableViewController 使用大表页脚滚动太远的主要内容,如果未能解决你的问题,请参考以下文章
使用 UITableViewController 时如何让 pickerView 粘在底部?
在 UIPopoverController 中显示 UItableViewController
在 UITableViewController 之外使用 NSFetchedResultsController