要覆盖哪个委托来调整自动滚动?
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 在开始/结束更新调用调整高度后自动滚动到顶部