2013-11-13 3 views
4

Вот код, я использую:как прокрутить табличное представление после правильной вставки строки внизу?

//inserting a row at the bottom first 
_numberOfRecords++; 
[_tableView beginUpdates]; 
[_tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:_numberOfRecords-1 inSection:0]] withRowAnimation:UITableViewRowAnimationBottom]; 
[_tableView endUpdates]; 
//clear text 
_inputField.text = @""; 

//then scroll to bottom 
CGPoint bottomOffset = CGPointMake(0, _tableView.contentSize.height + 44.0 + _tableView.contentInset.top - _tableView.bounds.size.height); 
NSLog(@"%f", _tableView.contentSize.height + 44.0 + _tableView.contentInset.top - _tableView.bounds.size.height); 
[_tableView setContentOffset:bottomOffset animated:YES]; 

Это прокручивать бы TableView в очень странным образом. Но если я поместил код прокрутки перед вставкой, он отлично работает, за исключением того, что он игнорирует последнюю вставленную строку. То есть, он прокручивается ко второй последней строке, а не прокручивается до последней строки (конечно, потому что она прокручивается перед вставкой нового рулона.)

Поэтому я считаю, что этот код не имеет проблем с положением, в котором он должен прокрутите список до. Проблема, вероятно, связана с вставкой строк в tableview. Это нарушает анимацию прокрутки табличного вида.

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

Я думал использовать scrollView или tableView, и я обнаружил, что встроенное приложение для сообщений Apple использует tableView, поэтому я принимаю tableView. Дайте мне знать, если scrollView с меткой лучше, чем tableView.

В любом случае, как я могу прокрутить таблицуView внизу после вставки новой строки?

+1

Не могли бы вы использовать 'scrollToRowAtIndexPath: atScrollPosition: анимированные:' – JeffN

ответ

7

Попробуйте использовать UITableView'sscrollToRowAtIndexPath::

[self.tableView scrollToRowAtIndexPath: atScrollPosition: animated:]; 
+0

Это отлично работает для меня. Но я видел, как некоторые люди говорят, что scrollToRowAtIndexPath не обрабатывает нижний колонтитул и секцию хорошо. –

1

Это мое собственное решение:

[_tableView reloadData]; 

    //scroll to bottom 
double y = _tableView.contentSize.height - _tableView.bounds.size.height; 
CGPoint bottomOffset = CGPointMake(0, y); 
NSLog(@"after = %f", y); 
if (y > -_tableView.contentInset.top) 
    [_tableView setContentOffset:bottomOffset animated:YES]; 

Во-первых reloadData после endUpdates. Это гарантирует, что tableView contentSize обновляется после вставки новой строки. Затем проверьте, превышает ли прокрутка расстояние до содержимогоInset.top (это позволяет избежать скрытия табличного представления за панель состояния и панели навигации), а затем прокручивать вниз, иначе не прокручивать из-за какой-то странной анимации.

В качестве альтернативы, вы можете просто использовать

[self.tableView scrollToRowAtIndexPath: inSection: atScrollPosition: animated:]; 

для перехода к строке вы хотите. Но это не очень хорошо обрабатывает ячейки с секциями и нижними колонтитулами. Для обычного TableViewCell вы можете просто использовать это, чтобы сделать магию. В противном случае вы можете найти мое решение трюк работает лучше.

В любом случае, спасибо за все ваши ответы.

+0

beginUpdates и endUpdates эффективно применяют изменения в представлении таблицы, reloadData перезагружает весь источник данных. Вы используете тот или иной, иначе это не имеет смысла. – Andy

+0

Если нет разницы в показанных данных, тогда не используйте [_tableView reloadData], иначе это даст вам проблему с производительностью. –

Смежные вопросы