Как вставить UITableViewCell внизу с анимацией? - PullRequest
0 голосов
/ 03 сентября 2018

Я прочитал https://stackoverflow.com/questions/

и попробовал так:

//UITableView 
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 50;

//Update the full code for the "return" key action
- (void)inputViewDidTapReturn:(MyInputView *)inputView text:(NSString *)text{
    NSLog(@"send text-----%@",text);
    [self.messageManager sendMessageTo:self.sessionID message:text  completion:^(BOOL success, Message *message) {
        if (success) {

            [self.dataArray addObject:message];

            NSIndexPath * bottomIndexPath = [NSIndexPath indexPathForRow:self.dataArray.count-1 inSection:0];

            [self.tableView beginUpdates];
            [self.tableView insertRowsAtIndexPaths:@[bottomIndexPath] withRowAnimation:UITableViewRowAnimationLeft];
            [self.tableView endUpdates];


            [self.tableView scrollToRowAtIndexPath:bottomIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

        } else {
        }
    }];
}

Но результат не показывался правильно:

enter image description here

Началась прокрутка с нижней части экрана.

UITableView и UITableViewCell оба используют Auto Layout, а UITableView уже находится над клавиатурой.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Правильный способ - использовать методы beginUpdates и endUpdates для вставки ячейки в табличное представление. Сначала вы должны добавить элемент в ваш массив.

array.append(item)

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

tableView.beginUpdates()
tableView.insertRows(at: [IndexPath(row: array.count-1, section: 0)], with: .automatic)
tableView.endUpdates()
0 голосов
/ 03 сентября 2018

Попробуйте это.

Цель C

[self.dataArray addObject:message];
[self.tableView reloadData];

dispatch_async(dispatch_get_main_queue(), ^{
    NSIndexPath *bottomIndexPath = [NSIndexPath indexPathForRow:self.dataArray.count-1 inSection:0];
    [self.tableView scrollToRowAtIndexPath:bottomIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
});

выход

enter image description here

Swift

self.dataArray.add(messasge)
self.tableView.reloadData()

DispatchQueue.main.async {
    let bottomIndexPath = IndexPath(row: self.dataArray.count-1, section: 0)
    self.tableView.scrollToRow(at: bottomIndexPath, at: .bottom, animated: true)
}
...