Клавиатура Прокрутка в активном текстовом поле - Прокрутка до поля зрения? - PullRequest
7 голосов
/ 25 августа 2011

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

Следуя Apple Docs , я поместил весь этот код в свою программу (листинги 4-1, 4-2) и добавил выходы scrollView и activeField в мой заголовочный файл и связал их с IB.

Проблема в том, что, как только я щелкаю текстовое поле, ВСЕ текстовые поля исчезают из виду, пока я не отклоню клавиатуру. Они прокручиваются очень далеко (опять же, достаточно далеко, чтобы ни одно из полей не было видно).

Кто-нибудь знает, чем может быть вызвана эта проблема?

Я размещаю здесь код из Apple Docs, чтобы вы могли точно видеть, какой код я использую, не щелкая мышью.

//my .h
    IBOutlet UIScrollView *scrollView;
    IBOutlet UITextField *activeField;

//.m
    // Call this method somewhere in your view controller setup code.
    - (void)registerForKeyboardNotifications
    {
        [[NSNotificationCenter defaultCenter] addObserver:self
                selector:@selector(keyboardWasShown:)
                name:UIKeyboardDidShowNotification object:nil];

   [[NSNotificationCenter defaultCenter] addObserver:self
             selector:@selector(keyboardWillBeHidden:)
             name:UIKeyboardWillHideNotification object:nil];

}

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;

    // If active text field is hidden by keyboard, scroll it so it's visible
    // Your application might not need or want this behavior.
    CGRect aRect = self.view.frame;
    aRect.size.height -= kbSize.height;
    if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
        CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height);
        [scrollView setContentOffset:scrollPoint animated:YES];
    }
}

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    activeField = textField;
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    activeField = nil;
}

Ответы [ 4 ]

33 голосов
/ 25 августа 2011

ОБНОВЛЕНИЕ: Ниже ответ устарел.На данный момент вы можете использовать библиотеку « TPkeyboardavoiding » для обработки всех видов операций с текстовыми полями в UIScrollView, UITableView и многих других.Попробуйте, и дайте мне знать, если у кого-то есть проблемы с интеграцией.

Старый ответ

Нет необходимости регистрироваться для уведомлений клавиатуры для этой функции.Чтобы центрировать активный textField на экране над клавиатурой, вам нужно только установить contentOffset UIscrollView двумя методами, как показано здесь:

// called when textField start editting.
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    activeField = textField;
    [scrollView setContentOffset:CGPointMake(0,textField.center.y-60) animated:YES];
}



// called when click on the retun button.
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{


    NSInteger nextTag = textField.tag + 1;
    // Try to find next responder
    UIResponder *nextResponder = [textField.superview viewWithTag:nextTag];

    if (nextResponder) {
        [scrollview setContentOffset:CGPointMake(0,textField.center.y-60) animated:YES];
        // Found next responder, so set it.
        [nextResponder becomeFirstResponder];
    } else {
        [scrollview setContentOffset:CGPointMake(0,0) animated:YES];
        [textField resignFirstResponder];   
        return YES;
    }

    return NO; 
}

Примечание: все TextField должны иметь инкрементные теги1,2,3 и так нет.И установите делегатов на себя.

Спасибо,

6 голосов
/ 13 февраля 2014

Поскольку я нашел его, я использую TPKeyboardAvoiding

Он отлично работает и его очень легко настроить:

  1. Добавить UIScrollView в ваш видКонтроллер xib
  2. Установите класс представления прокрутки в TPKeyboardAvoidingScrollView (все еще в xib, через инспектор идентификации)
  3. Поместите все ваши элементы управления в это представление прокрутки

Это такжеавтоматически подключает кнопки «Далее» на клавиатуре для переключения между текстовыми полями.

Удачи!

1 голос
/ 15 апреля 2016

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

Вот мой подход (Слегка видоизмененный путь яблока) -

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    self.scrollView.contentInset = contentInsets;
    self.scrollView.scrollIndicatorInsets = contentInsets;
}

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    self.scrollView.contentInset = contentInsets;
    self.scrollView.scrollIndicatorInsets = contentInsets;
}
0 голосов
/ 26 августа 2011

Убедившись, что делегат установлен, я просмотрел код и вычеркнул все координаты всего, выполнил всю математику и должен был вручную установить некоторые переменные, но теперь он работает как задумано.

Если кому-то понадобится помощь в будущем, я буду рад помочь.Мой Twitter находится в моем профиле.

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