UITableView scrollToRowAtIndexPath не работает для последних 4

Я в UITableViewController, и у меня есть текстовые поля внутри ячеек. Когда пользователь нажимает на текстовое поле, я реализую UITextFieldDelegate и в методе textFieldDidBeganEditing. Я определяю индекс ячейки и прокручиваю ее до этой позиции. Он отлично работает для всех ячеек для последних 4-5 ячеек. Что я делаю не так? Спасибо.

Ответ 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];