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

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

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

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

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

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

谢谢

【问题讨论】:

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

标签: ios iphone uitableview uiscrollview uitextfield


【解决方案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];

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2014-08-18
    • 2012-05-08
    • 1970-01-01
    • 2016-08-04
    • 2016-03-16
    • 1970-01-01
    相关资源
    最近更新 更多