在iPhone SDK中阻止光标进入键盘后面的最简单方法是什么?

时间:2010-07-19 10:56:12

标签: iphone uitableview uiview uitextfield ios

我有a table with several text fields。点击任何UITextField会弹出键盘,如果需要,视图会自动滚动以将光标移到键盘上方。

我有一个方法可以在用户在编辑文本字段时按下Return键时调用,我只需将第一个响应者状态移动到下一个文本字段。但是,如果它碰巧在键盘后面,它不会向上滚动并显示出来。

我知道这涉及使用beginAnimations的{​​{1}}方法并更改视图的位置或大小,但我不知道如何计算视图应移动多少等等?是否有捷径可寻?我认为Apple没有在文档中解释过这一点,我已经尝试过谷歌搜索,但无法找到一个合适的解决方案。

非常感谢任何帮助。

谢谢。

2 个答案:

答案 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的子视图。