Как сделать автоматическую прокрутку UIScrollView, когда UITextField становится первым ответчиком

Я видел сообщения вокруг здесь о том, что UIScrollViews должен автоматически прокручиваться, если subview UITextField становится первым ответчиком; однако я не могу понять, как заставить это работать.

у меня есть UIViewController что есть UIScrollView и в UIScrollView существует несколько текстовых полей.

Я знаю, как сделать это вручную, если это необходимо; однако, из того, что я читал, представляется возможным его автопрокрутки. Помощь пожалуйста.

7 ответов


Я надеюсь, этот пример поможет вам С помощью этого кода можно прокрутить в любую точку.

scrollView.contentOffset = CGPointMake(0,0);

Так что если у вас есть textfield, он должен иметь некоторую позицию x, y на вид, так что вы можете использовать

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

это должно сделать трюк,

но если вы не знаете, когда вызывать этот код, так что вы должны узнать UITextFieldDelegate методы

реализуйте этот метод в своем коде

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

надеюсь, вы знаете, как использовать delegate методы.


Я знаю, что на этот вопрос уже ответили, но я думал, что поделюсь кодовой комбинацией, которую я использовал из @Adeel и @Basil answer, поскольку она, похоже, отлично работает для меня на 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];
}

Я также использовал анимированный метод, он обеспечивает гораздо более плавный переход.


нет ничего, что вы должны сделать вручную. Это поведение по умолчанию. Есть две возможности относительно того, почему вы не видите поведение

  1. наиболее вероятной причиной является то, что клавиатура на UITextField. См. ниже для решения
  2. другая возможность заключается в том, что у вас есть другой UIScrollView где-то в иерархии между UITextField и UIScrollView что вы хотите автопрокрутка. Это менее вероятно, но все еще может вызвать проблемы.

для #1, вы хотите реализовать что-то похожее на рекомендации Apple для перемещение содержимого, которое находится под клавиатурой. Обратите внимание, что код, предоставленный 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

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

EDIT:

Im теперь использует IQKeyboardManager Слава разработчику этого, вам нужно попробовать это.


вот обновление Swift 4 для ответа @Supertecnoboff. Это сработало отлично для меня.

func textFieldDidBeginEditing(_ textField: UITextField) {
    scroll.setContentOffset(CGPoint(x: 0, y: (textField.superview?.frame.origin.y)!), animated: true)
}

func textFieldDidEndEditing(_ textField: UITextField) {
    scroll.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
}

обязательно расширьте UITextFieldDelegate и установите делегат textfields в self.


если у вас есть несколько текстовых полей, скажите Textfield1, Textfield2, Textfield3 и вы хотите прокрутить scrollview вдоль оси y, когда textfield2 станет первым ответчиком:

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