Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iphonesdk中防止光标落在键盘后面的最简单方法是什么?_Iphone_Uitableview_Uiview_Uitextfield_Ios - Fatal编程技术网

在iphonesdk中防止光标落在键盘后面的最简单方法是什么?

在iphonesdk中防止光标落在键盘后面的最简单方法是什么?,iphone,uitableview,uiview,uitextfield,ios,Iphone,Uitableview,Uiview,Uitextfield,Ios,我有很多钱。点击任何UITextFields会打开键盘,视图会自动滚动,以便在需要时将光标置于键盘上方 我有一个方法,每当用户在编辑文本字段时按下Return键时,就会调用该方法,我只需将第一响应者状态移动到该文本字段中的下一个文本字段。但是,如果它恰好在键盘后面,它不会向上滚动并显示自己 我知道这涉及到使用UIView的beginAnimations方法和更改视图的位置或大小,但我不知道如何计算视图应移动多少,等等。?有没有一个简单的方法可以做到这一点?我不认为苹果在文档中解释了这一点,我也尝

我有很多钱。点击任何
UITextField
s会打开键盘,视图会自动滚动,以便在需要时将光标置于键盘上方

我有一个方法,每当用户在编辑文本字段时按下Return键时,就会调用该方法,我只需将第一响应者状态移动到该文本字段中的下一个文本字段。但是,如果它恰好在键盘后面,它不会向上滚动并显示自己

我知道这涉及到使用
UIView
beginAnimations
方法和更改视图的位置或大小,但我不知道如何计算视图应移动多少,等等。?有没有一个简单的方法可以做到这一点?我不认为苹果在文档中解释了这一点,我也尝试过谷歌搜索,但没有找到一个像样的解决方案

任何帮助都将不胜感激


谢谢。

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];
}

编辑:注意:为了实现这一点,传递的
UIView
最好是
scrollView

的子视图,这要感谢这里的“MVD”和文档中的一些挖掘。这就是我修订的“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”方法相应地偏移表视图


我已经发布了这么多的细节,因为我必须尽最大的努力来找出它是如何工作的,我想这可能会节省其他人的时间。我希望它有用。

表格不在滚动视图中,因此我不确定如何调整这段代码以满足我的需要。谢谢你的快速回复。考虑到iPhone SDK中提供的API的广度,如此普通的东西需要付出如此多的努力才能实现,这真是令人惊讶。好吧,看看你的屏幕截图,它是一个
UITableView
,一开始并没有得到这一点
UITableView
继承自
UIScrollView
,因此我认为您可以继续并在其上设置
setContentOffset
;i、 e.如果愿意,将
scrollView
替换为
tableView
。但请检查
tableView.contentSize.height
是否具有预期值。您定位的表格单元格可以作为
UIView
传递。非常感谢!我要说的是,我对如何进行这些基于点的计算来确定哪个视图应该移动到哪里没有很好的理解,所以我并不真正理解这段代码中到底发生了什么。然而,我确实设置了一些断点,并确定“y”在我的应用程序中总是以负数结尾,因此我改变了“if”条件:“if(y<0.0f)y=200.0f;”。它现在正在工作。谢谢你。我必须以某种方式理解它的工作原理……计算非常简单,但你必须始终记住它们是相对于视图的容器的。例如,主
UIView
相对于窗口定位,
UITableView
相对于
UIView
定位,
UITableViewCell
相对于
UITableView
定位。我找到了一种解决问题的方法,现在我对其工作原理有了更好的理解(还有一个更精简的代码)。将其作为答案发布在这里。再次感谢您的帮助。如果不是这样的话,我会花很多时间来解决这个问题。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollViewToCenter) name:UITextFieldTextDidBeginEditingNotification object:textField];