我有a table with several text fields。点击任何UITextField
会弹出键盘,如果需要,视图会自动滚动以将光标移到键盘上方。
我有一个方法可以在用户在编辑文本字段时按下Return键时调用,我只需将第一个响应者状态移动到下一个文本字段。但是,如果它碰巧在键盘后面,它不会向上滚动并显示出来。
我知道这涉及使用beginAnimations
的{{1}}方法并更改视图的位置或大小,但我不知道如何计算视图应移动多少等等?是否有捷径可寻?我认为Apple没有在文档中解释过这一点,我已经尝试过谷歌搜索,但无法找到一个合适的解决方案。
非常感谢任何帮助。
谢谢。
答案 0 :(得分:1)
找到了解决方案,感谢这里的'mvds'以及文档中的一些内容。这就是我修改后的'scrollViewToCenter'方法:
- (void)scrollViewToCenter
{
[self determineActiveTextField];
CGPoint textFieldOrigin = [activeTextField convertPoint:activeTextField.frame.origin toView:self.view];
CGFloat scrollPoint = self.view.frame.size.height / 2 - activeTextField.frame.size.height;
if (textFieldOrigin.y > scrollPoint) {
CGFloat scrollDistance = textFieldOrigin.y - scrollPoint;
[self.tableView setContentOffset:CGPointMake(0.0f,scrollDistance) animated:YES];
}
}
每当用户点击任何文本字段(或者已经以编程方式成为第一个响应者)时,我通过将其添加为“UITextFieldTextDidBeginEditingNotification”通知的选择器来调用它:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollViewToCenter) name:UITextFieldTextDidBeginEditingNotification object:textField];
当调用该方法时,它首先确定七个文本字段中的哪一个是活动的,然后使用'convertPoint:toView:'方法将其原点转换为'self.view'上的一个点。一旦我得到文本字段的起点,我就会计算它是否低于屏幕的中间点,如果是,则使用'setContentOffset'方法相应地偏移表视图。
我已经发布了这么详细的内容,因为我不得不竭尽全力去了解它是如何工作的,并且我认为它可能会节省其他人的时间。我希望它很有用。
答案 1 :(得分:0)
AFAIK确实没有开发人员友好的方式来做到这一点。从另一个项目复制和粘贴,这就是我想出的:
-(void)scrollViewToCenter:(UIView*)v
{
CGFloat windowLeft = 200.0f;
CGFloat y = v.frame.origin.y-(windowLeft - v.frame.size.height)/2;
if ( y > scrollView.contentSize.height - windowLeft )
{
y = scrollView.contentSize.height - windowLeft;
}
if ( y < 0.0f ) y = 0.0f;
[scrollView setContentOffset:CGPointMake(0.0f,y) animated:YES];
}
windowleft是键盘弹出时剩余的px数。这假设您有一个名为UIScrollView
的{{1}}。
然后只需致电
scrollView
编辑:注意:为此,[self scrollViewToCenter:tf];
通过的UIView
最好是scrollView
的子视图。