Вставьте последнюю строку в UITableView с плавной прокруткой - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь создать приложение, похожее на чат-бота, я использовал UITableView с пользовательскими ячейками, чтобы соответствовать моим потребностям.Всякий раз, когда добавляется новое сообщение, я создаю и вставляю новую строку, а затем прокручиваю до нижней части UITableView.Все работает до определенной точки, но когда изменяется высота ячеек (у меня есть два разных типа ячеек), анимация становится грязной, она не плавно прокручивается до конца, и все UITableView мигает, чтоне хороший пользовательский опыт.Я попробовал несколько подходов:

1 - добавьте данные в массив источника данных и перезагрузите UITableView, затем прокрутите вниз.

2 - используйте insertRowsAtIndexPaths затемпрокрутите вниз.

У них обоих одинаковая проблема с прокруткой.Я использовал scrollToRowAtIndexPath, чтобы добраться до конца UITableView

Я загрузил код демонстрационного приложения, которое представляет имитирует ту же проблему здесь , поэтому будет легкоПонимаю. Здесь - видео проблемы.Любая помощь очень ценится.

Эта проблема не может возникать на симуляторе, пожалуйста, запустите демонстрационный проект на устройстве.

После прочтения всех комментариев и обсуждения в чатеЯ заметил, что это происходит на iPhone 5C (10.3.3).Я запустил демонстрацию на iPhone 5S (11.3), и проблема не возникает.Не уверен, что это как-то связано с ОС.

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

После просмотра источника можно сказать, что tableView reloadData перезагружает ячейки каждый раз, что делает анимацию более занятой для каждой дополнительной ячейки.Для ваших целей вы должны использовать другую систему:

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[indexPathOfYourCell] withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView endUpdates]; 

И чем, возможно, вам понадобится scrollToRowAtIndexPath в конце тоже

0 голосов
/ 04 июня 2018

Вам понадобится это, измените второй подход, как показано ниже

[arrHeight addObject:@"50"];
//    [_myTable beginUpdates];
    NSIndexPath *row1 = [NSIndexPath indexPathForRow:arrData.count inSection:0];
    [arrData insertObject:@"1" atIndex:arrData.count];
    [_myTable insertRowsAtIndexPaths:[NSArray arrayWithObjects:row1, nil] withRowAnimation:UITableViewRowAnimationNone];
    [_myTable reloadRowsAtIndexPaths:@[row1] withRowAnimation:UITableViewRowAnimationNone];

//    [_myTable endUpdates];
    [self scrollTableviewToLastRow];
0 голосов
/ 04 июня 2018

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

Внесите следующие изменения в ваши Методы действий

- (IBAction)btnLargeCellClicked:(id)sender {    // To add large green colored row.

    /************ This is the FIRST approach. ***********/
    [arrHeight addObject:@"100"];
    [arrData addObject:@"1"];
    NSIndexPath* ip = [NSIndexPath indexPathForRow:[_myTable numberOfRowsInSection:0] inSection:0];
    [_myTable insertRowsAtIndexPaths:@[ip] withRowAnimation:UITableViewRowAnimationFade];
    [self scrollTableviewToLastRow];


    /************ This is the SECOND approach. ***********/
//    [arrHeight addObject:@"100"];
//    [_myTable beginUpdates];
//    NSIndexPath *row1 = [NSIndexPath indexPathForRow:arrData.count inSection:0];
//    [arrData insertObject:@"1" atIndex:arrData.count];
//    [_myTable insertRowsAtIndexPaths:[NSArray arrayWithObjects:row1, nil] withRowAnimation:UITableViewRowAnimationFade];
//    [_myTable endUpdates];
//    [self scrollTableviewToLastRow];
}

И

- (IBAction)btnClicked:(id)sender {     // To add small red colored row.
    /************ This is the FIRST approach. ***********/
    [arrHeight addObject:@"50"];
    [arrData addObject:@"1"];
    NSIndexPath* ip = [NSIndexPath indexPathForRow:[_myTable numberOfRowsInSection:0] inSection:0];
    [_myTable insertRowsAtIndexPaths:@[ip] withRowAnimation:UITableViewRowAnimationFade];
    [self scrollTableviewToLastRow];


    /************ This is the SECOND approach. ***********/
//    [arrHeight addObject:@"50"];
//    [_myTable beginUpdates];
//    NSIndexPath *row1 = [NSIndexPath indexPathForRow:arrData.count inSection:0];
//    [arrData insertObject:@"1" atIndex:arrData.count];
//    [_myTable insertRowsAtIndexPaths:[NSArray arrayWithObjects:row1, nil] withRowAnimation:UITableViewRowAnimationFade];
//    [_myTable endUpdates];
//    [self scrollTableviewToLastRow];

}

Надеждаэто помогает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...