UITableView scrollToRowAtIndexPath не работает для последних 4 - PullRequest
10 голосов
/ 15 июня 2011

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

Ответы [ 3 ]

35 голосов
/ 15 июня 2011

scrollToRowAtIndexPath: метод прокручивает ячейку до UITableViewScrollPositionTop или UITableViewScrollPositionMiddle , только если tableView contentSize достаточно велико, чтобы вывести ячейку эти позиции. Если ячейка, которую вы пытаетесь прокрутить до верха или середины, является последней или из последних нескольких ячеек, ее нельзя прокрутить до середины или верха. В этих ситуациях вам нужно вручную вычислить contentOffset для этих ячеек.

Правка - Расчет содержимогоOffset:

Чтобы рассчитать 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];
3 голосов
/ 16 июля 2012

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

Мой рабочий код выглядит так

Телефонный код

MyViewController *cont = [[MyViewController alloc] initWithMedication:medication];
cont.sectionToShow = 1;
[self.navigationController pushViewController:cont animated:YES];

[cont release];

Просмотр кода контроллера внутри viewWillAppear

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:self.sectionToShow];
[cont.tableview scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];

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

0 голосов
/ 15 июня 2011

Это то, что вы должны использовать при попытке определить indexPath представления / textField, добавленного в UITableViewCell

CGPoint point = [textField.superview convertPoint:textField.frame.origin toView:self.tableView];

Тогда используйте точку с

NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:point];
...