要覆盖哪个委托来调整自动滚动?

Posted

技术标签:

【中文标题】要覆盖哪个委托来调整自动滚动?【英文标题】:Which delegate to override for tuning the auto scrolling? 【发布时间】:2013-10-23 02:50:59 【问题描述】:

我对这个问题感到非常沮丧,我希望有人可以帮助我。

从第一个屏幕可以看出,原光标位置在密码中

将光标移至电子邮件后,屏幕会向上移动一点,如屏幕截图 2 所示

我试图覆盖“textFieldDidBeginEditing” 甚至将观察者添加到“keyboardWillShow 通知”以控制键盘的显示。 但两者都不起作用。它仍然移动了一点点,我想要的是更多。我注意到的是,如果整个 textField 可见并且“textFieldDidBeginEditing”被正确调用,则只有当半行被覆盖/隐藏时它才不起作用。

我想肯定有一些委托方法要么与 tableView/ScrollView 相关,要么与键盘或 UIResponder 相关,我不确定,但需要有经验的开发人员的帮助。

谢谢

【问题讨论】:

这是在分组表视图中吗? 你想要什么,它更靠近屏幕的中心? 你需要详细说明这个视图是如何布局的——它是像凯文问的那样是一个分组的表格视图吗?或者这是您在文本字段开始编辑时手动移动偏移量的滚动视图? 你们是对的,它是一个分组的tableView。那么你们知道我可以覆盖哪个委托方法吗? 【参考方案1】:

您似乎正在使用分组表视图。当它成为第一响应者时,它们会自动滚动文本字段以使其可见。但是,正如您所发现的,这意味着如果文本字段在屏幕上的一半,它只会一直滚动到顶部(或底部)。如果您希望它始终显示在屏幕上的特定点,您需要自己计算和设置偏移量。但是,如果您直接从 textFieldDidBeginEditing 回调中执行此操作,它将被表格的默认滚动覆盖,因此我们稍微延迟一下。

-(void) textFieldDidBeginEditing:(UITextField *)textField

    double delayInSeconds = 0.01;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
        CGRect bounds = textField.bounds;
        CGPoint offset = [self.tableView convertPoint:bounds.origin fromView:textField];
        offset.x = 0;
        offset.y -= 150;
        [self.tableView setContentOffset:offset animated:YES];
    );

请注意,ios 7 的表格滚动有点错误,所以这可能会导致有点跳跃。你可以通过增加延迟到自动滚动之后来减少跳跃,0.25s应该是好的。

【讨论】:

非常感谢凯文的这个解决方案。但我更期待一个解决方案,我可以覆盖一些默认委托方法,以便我可以控制 tableView 范围内的行为,否则我需要手动计算每个 textField 的距离,我认为这不是一个很好的解决方案. 没有神奇的委托方法。此代码已经计算了每个文本字段的距离。您唯一需要更改的是-= 150,将其调整为您想要字段在屏幕上的位置。 您可以对表进行子类化并覆盖 setOffset:animated: 方法,但祝您好运,弄清楚何时应该或不应该阻止/更改它。 我想您的解决方案是我能拥有的最佳实践。谢谢【参考方案2】:
- (void) textFieldDidBeginEditing:(UITextField *)textField

     //if you just want to set the contentOffset when editing emailField add following condition
    if (textField==emailField) 

        float yOffSet = someValue;     

        [mytableView setContentOffset:CGPointMake(0.0f, yOffSet)];

        [emailField becomeFirstResponder];

    

【讨论】:

以上是关于要覆盖哪个委托来调整自动滚动?的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 在开始/结束更新调用调整高度后自动滚动到顶部

winform中如何禁止richtextbox的自动滚动

使用垂直自动调整大小时视图向上移动

自动调整大小和滚动的 Java JTextArea

在 UIScrollView 中自动调整 UITextView 的大小

嵌套滚动视图自动滚动到底部