Просмотр прокрутки, клавиатуры, скрытые текстовые поля и программно нарисованные ячейки пользовательской таблицы

#ios

#iOS

Вопрос:

Я пытаюсь настроить вид прокрутки, когда пользователь нажимает кнопку «Далее» на клавиатуре. Сложность заключается в том, что я программно генерирую пользовательские ячейки таблицы. Каждая ячейка содержит текстовое поле. Это выглядит примерно так:

https://img.skitch.com/20110520-n8k7cm224mtfdc2wsgpjpmghke.jpg

Я попытался следовать инструкциям Apple по перемещению содержимого из-за клавиатуры, но обнаружил, что в данном случае это не совсем работает, в первую очередь потому, что UIKeyboardDidShowNotification вызывается только один раз, а не при каждом нажатии кнопки «Далее».

Моим решением было перепрограммировать пример Apple, чтобы использовать UIKeyboardDidShowNotification для сохранения высоты клавиатуры и textFieldDidBeginEditing для обработки настройки вида прокрутки.

Вот как я (пытаюсь) настроить вид прокрутки:

 - (void)textFieldDidBeginEditing:(UITextField *)textField
{
    activeField = textField;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbHeight, 0.0);

    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;

    CGRect aRect = self.view.frame;
    aRect.size.height -= kbHeight;

    if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
        CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbHeight);
        [scrollView setContentOffset:scrollPoint animated:YES];
    }
}
  

В этой функции блок if никогда не срабатывает. Я использовал пару инструкций NSLog, чтобы обнаружить, что каждый экземпляр ActiveField сообщает об одном и том же источнике (несмотря на то, что не имеет общего видимого источника при запуске приложения).

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

Итак, мой вопрос — я думаю — таков: как мне получить программно сгенерированные ячейки пользовательской таблицы, содержащие текстовое поле, чтобы они имели правильное происхождение?

Комментарии:

1. TableView — это scrollview, я думаю, вам не следует вводить новый уровень сложности, оборачивая TableView в ScrollView. Чтобы прокрутить TableView до определенной ячейки, вы можете использовать: scrollToRowAtIndexPath:atScrollPosition:animated: . Если клавиатура скрывает нижние строки, которые нужно прокручивать, просто уменьшите высоту TableView. Вы можете получить рамку клавиатуры в словаре userInfo, передаваемую вызовами делегатов и уведомлениями.

2. Вот и все! Вы должны повторно опубликовать это в качестве ответа, чтобы я мог должным образом оценить. Спасибо за помощь!

3. очень хорошо, и вот вам отдельный ответ 🙂

Ответ №1:

TableView — это scrollview, я думаю, вам не следует вводить новый уровень сложности, оборачивая TableView в ScrollView.

Чтобы прокрутить TableView до определенной ячейки, вы можете использовать: scrollToRowAtIndexPath:atScrollPosition:animated: .

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

Ответ №2:

Подвиды имеют свой frame набор, основанный на их супервидениях. Таким образом, в каждой ячейке textField находится в одном и том же месте. Таким образом, вы получаете одинаковое происхождение для каждого из ваших текстовых полей. То, что вам нужно здесь, — это рамка ячейки. Предполагая, что ячейка является родительской для textField . Вы можете сделать это activeField.superview.frame вместо activeField.frame .

Комментарии:

1. Спасибо за это! Это очень полезно знать. Оказывается, мне пришлось подняться на два уровня (ActiveField.superview.superview.frame). Однако даже после получения правильного источника кадра CGRectContainsPoint все еще возвращал true .