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】:

我通过在tableviewcontrollertableview 下方添加一个额外的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

在 UITableViewController 之外使用 NSFetchedResultsController

为啥我不能使用“List”作为 UITableViewController 子类的类名?

在 UITableViewController 上使用 UIViewController 类