UIRefreshControl проблемы с переходом и флэш - PullRequest
0 голосов
/ 28 июня 2018

У меня есть UITableViewController со встроенным UIRefreshControl. У меня есть две проблемы с обновлением анимации, которые я хочу исправить.

  1. Когда я перетаскиваю представление таблицы, оно начинает обновлять данные с нашего сервера. Если пользователь продолжает его перетаскивать, происходит заметный скачок смещения.

  2. Когда операция обновления заканчивается, табличное представление скрывает анимированный элемент управления обновлением. После того, как он закончит скрывать его, элемент управления будет мигать несколько кадров.

Showcase

Управление настраивается с UIStoryboard. Я установил цель и оттенок цвета оттуда. Когда действие запускается, мой код обновляет данные с нашего сервера, который имеет обратный вызов, когда сервер отвечает. Я прекращаю управление обновлением оттуда:

dispatch_async(dispatch_get_main_queue(), ^{
   [self.refreshControl endRefreshing];
});
...
[self.tableView reloadData];

Что-то я делаю неправильно или UIRefreshControl просто глючит в iOS 11?

Ответы [ 2 ]

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

На данный момент UIRefreshControl является чем-то загадочным (на него влияют многие вещи - используете ли вы большие заголовки, установите refreshControl в viewDidLoad или где-либо еще и т. Д.)

Лучший способ избавиться от этих проблем - перестать наблюдать valueChanged за UIRefreshControl и выполнить reloadData / endRefreshing после того, как вы убедитесь, что перетаскивания нет (например, scrollViewDidEndDragging).

Также мне удалось воспроизвести мерцание индикатора активности из UIRefreshControl из вашего gif таким образом (и только для iPhone-подобных устройств без прозрачности навигационной панели) :

edgesForExtendedLayout = [.top]
extendedLayoutIncludesOpaqueBars = true

тогда все, что мне нужно было сделать, это поменять edgesForExtendedLayout и extendedLayoutIncludesOpaqueBars.

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

У меня возникла похожая проблема, и вот как я наконец исправил ее:

  1. Необходимо установить свойство «предполагаемая высота строки». В противном случае reloadData() вызывает заметный скачок. Это объясняется здесь

  2. Вызов endRefreshing() во время перетаскивания пользователя также приводит к заметному прыжку. Чтобы этого избежать:

    • Когда я получаю новые данные с сервера, я проверяю, продолжает ли пользователь перетаскивать (UIScrollView.isDragging). Если это так, то я не сразу звоню endRefreshing(), а вместо этого устанавливаю флаг.
    • Я переопределяю scrollViewDidEndDragging и проверяю флаг там; если установлено, я звоню endRefreshing() и снимаю флажок.
...