UITableView beginUpdates / endUpdates во время прокрутки делает прыжок прокрутки - PullRequest
0 голосов
/ 14 марта 2019

My UITableView необходимо отобразить некоторые изображения с сервера. UITableViewCell состоит из одинарных UIImageView и NSLayoutConstraint для высоты UIImageView.

В cellForRowAtIndexPath в контроллере представления он выбирает изображение с сервера и изменяет размер изображения до ширины экрана. Одна важная вещь состоит в том, что изображение должно сохранять аспект, поэтому я сделал код, чтобы получить высоту изображения, сохраняющего аспект. Высота применяется к ограничению макета, которое относится к высоте представления изображения.

Если я не вызываю [tableView beginUpdates] и [tableView endUpdates] метод, ячейка не изменяет размеры, поэтому я вызываю эти методы после загрузки каждого изображения для ячейки. Проблема заключается в том, что при прокрутке изображения пользователем при просмотре изображения и при вызове методов beginUpdates и endUpdates прокрутка переходит к некоторой точке. (Я не уверен, куда переходит табличное представление)

Вот что я пытался предотвратить, прыгая:

- (void)resizeCellHeight {
    [UIView performWithoutAnimation:^{
        self->currentScrollY = self.tableView.contentOffset.y;

        [self.tableView beginUpdates];
        [self.tableView endUpdates];

        self->currentScrollY = -1;
    }];
}


- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if(currentScrollY != -1) {
        [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x, currentScrollY) animated:NO];
    }
}

Иногда это работало, но не на 100%. Этот код иногда даже препятствовал замедлению и продолжал прыгать.

Есть ли что-нибудь, чтобы предотвратить прокручивание вида прокрутки? или лучший способ вычислить ячейку?

1 Ответ

0 голосов
/ 14 марта 2019

Выборка данных в cellForRow не в порядке.Это отнимает много времени, и вы блокируете основной поток.

Все связанные с сервером элементы должны быть выполнены в другом потоке, и после его завершения вы перезагружаете tableView (или определенный элемент из него).

Если вы знаете размер изображения, вы можете создатьячейка, используя размер изображения в вашем imageView, а затем просто обновите ячейку, используя [tableView reloadAtIndexPaths:] после того, как у вас есть данные с сервера для этой строки.

Чтобы сохранить соотношение сторон, просто установите contentMode для imageView на .aspectFit.

Чтобы полностью ответить на ваш вопрос, вам нужно переосмыслить процесс.Переместить все, что связано с сервером, в другой поток.Когда предметы будут доступны, перезагрузите ячейку.Попробуйте создать ячейки с фиксированным размером и просто обновите их, когда у вас есть данные.Установите для imageView contentMode значение aspectFit.

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