如何在UITextField成为第一响应者时进行UIScrollView自动滚动

我已经看到这里的post,build议UIScrollViews应该自动滚动,如果子视图UITextField成为第一响应者; 然而,我不知道如何得到这个工作。

我有一个UIViewController有一个UIScrollViewUIScrollView有多个文本框。

我知道如何手动做到这一点,如果有必要; 然而,从我一直在阅读,似乎有可能自动滚动。 请帮助。

我希望这个例子会帮助你你可以滚动到这个代码的任何一点。

 scrollView.contentOffset = CGPointMake(0,0); 

所以如果你有文本框,它必须有一些x,y的位置,所以你可以使用

 CGPoint point = textfield.frame.origin ; scrollView.contentOffset = point 

这应该做的伎俩,

但是如果你不知道何时调用这个代码,那么你应该学习UITextFieldDelegate方法

在你的代码中实现这个方法

 - (void)textFieldDidBeginEditing:(UITextField *)textField { // Place Scroll Code here } 

我希望你知道如何使用委托方法。

我知道这个问题已经被回答了,但是我认为我会分享@Adeel和@Basil所使用的代码组合,因为它似乎在iOS 9上完全适合我。

 -(void)textFieldDidBeginEditing:(UITextField *)textField { // Scroll to the text field so that it is // not hidden by the keyboard during editing. [scroll setContentOffset:CGPointMake(0, (textField.superview.frame.origin.y + (textField.frame.origin.y))) animated:YES]; } -(void)textFieldDidEndEditing:(UITextField *)textField { // Remove any content offset from the scroll // view otherwise the scroll view will look odd. [scroll setContentOffset:CGPointMake(0, 0) animated:YES]; } 

我也使用了animation方法,它使得过渡更平滑。

没有什么你必须手动。 这是默认行为。 有两种可能性,为什么你没有看到这种行为

  1. 最可能的原因是键盘覆盖了你的UITextField 。 见下面的解决scheme
  2. 另一种可能是你在UITextField和你想自动滚动的UIScrollView之间的视图层次结构中有另一个UIScrollView 。 这是不太可能的,但仍然可以导致问题。

对于#1,你想要实现类似于苹果的build议移动位于键盘下的内容 。 请注意,Apple提供的代码不包含旋转。 为了改进他们的代码,请查看这篇博文的keyboardDidShow方法的实现,该方法使用窗口正确地转换键盘的框架。

 - (void)textFieldDidBeginEditing:(UITextField *)textField { CGRect rect = [textField bounds]; rect = [textField convertRect:rect toView:self.scrollView]; rect.origin.x = 0 ; rect.origin.y -= 60 ; rect.size.height = 400; [self.scrollView scrollRectToVisible:rect animated:YES]; } 

你可以使用这个函数为UITextField的autoScroll

UITextFieldDelegate

 - (void)textFieldDidBeginEditing:(UITextField *)textField { [self autoScrolTextField:textField onScrollView:self.scrollView]; } - (void) autoScrolTextField: (UITextField *) textField onScrollView: (UIScrollView *) scrollView { float slidePoint = 0.0f; float keyBoard_Y_Origin = self.view.bounds.size.height - 216.0f; float textFieldButtomPoint = textField.superview.frame.origin.y + (textField.frame.origin.y + textField.frame.size.height); if (keyBoard_Y_Origin < textFieldButtomPoint - scrollView.contentOffset.y) { slidePoint = textFieldButtomPoint - keyBoard_Y_Origin + 10.0f; CGPoint point = CGPointMake(0.0f, slidePoint); scrollView.contentOffset = point; } 

编辑:

我现在使用IQKeyboardManager的这个开发者的荣誉,你需要尝试这个。

如果您有多个文本Textfield1 ,分别是Textfield2Textfield1Textfield2 ,并且您希望textfield2成为第一个响应者时沿着y轴滚动滚动视图:

 if([Textfield2 isFirstResponder]) { scrollView.contentOffset = CGPointMake(0,yourY); }