#ios
#iOS
Вопрос:
Я пытаюсь настроить вид прокрутки, когда пользователь нажимает кнопку «Далее» на клавиатуре. Сложность заключается в том, что я программно генерирую пользовательские ячейки таблицы. Каждая ячейка содержит текстовое поле. Это выглядит примерно так:
Я попытался следовать инструкциям 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 .