Я в UITableViewController, и у меня есть текстовые поля внутри ячеек. Когда пользователь нажимает на текстовое поле, я реализую UITextFieldDelegate и в методе textFieldDidBeganEditing. Я определяю индекс ячейки и прокручиваю ее до этой позиции. Он отлично работает для всех ячеек для последних 4-5 ячеек. Что я делаю не так? Спасибо.
UITableView scrollToRowAtIndexPath не работает для последних 4
Ответ 1
scrollToRowAtIndexPath: метод прокручивает ячейку до UITableViewScrollPositionTop или UITableViewScrollPositionMiddle только в том случае, если tableView contentSize достаточно велик, чтобы довести ячейку до этих позиций. Если ячейка, которую вы пытаетесь прокрутить вверх или в середине, является последней ячейкой или из последних нескольких ячеек, ее нельзя прокручивать до середины или сверху. В этих ситуациях вам необходимо вычислить contentOffset вручную для этих ячеек.
Изменить - вычисление contentOffset:
Для вычисления contentOffset используйте метод, указанный в @Schoob. Поместите следующий код в свой метод textFieldDidBeginEditing.
CGPoint origin = textField.frame.origin;
CGPoint point = [textField.superview convertPoint:origin toView:self.tableView];
float navBarHeight = self.navigationController.navigationBar.frame.size.height;
CGPoint offset = tableView.contentOffset;
// Adjust the below value as you need
offset.y += (point.y - navBarHeight);
[tableView setContentOffset:o animated:YES];
Ответ 2
Я нашел ключ к использованию scrollToRowAtIndexPath, чтобы убедиться, что вы вызываете это после представления. То есть нажата на навигационный контроллер или представлена модально.
Мой рабочий код выглядит следующим образом
Код вызова
MyViewController *cont = [[MyViewController alloc] initWithMedication:medication];
cont.sectionToShow = 1;
[self.navigationController pushViewController:cont animated:YES];
[cont release];
Код Viewcontroller внутри viewWillAppear
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:self.sectionToShow];
[cont.tableview scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
Если бы я сделал это по-другому, всегда были краевые случаи, когда это не сработало. Думаю, мы хотим прокрутить в конце цикла презентации.
Ответ 3
Это то, что вы должны использовать при попытке определить indexPath вида /textField, добавленного в UITableViewCell
CGPoint point = [textField.superview convertPoint:textField.frame.origin toView:self.tableView];
Затем используйте точку с
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:point];