Пара советов по использованию UIRefreshControl

Доброго времени суток. Дальше речь пойдет об использовании UIRefreshControl не в UINavigationBar, а непосредственно в UIScrollView, поскольку все описанные проблемы отсутствуют в первом случае.

Если вы кода-нибудь обращали внимание на работу UIRefreshControl, то наверняка замечали, что во-первых, после его срабатывания происходит небольшое смещение контента (лаг скролла), и во-вторых анимация самого контрола выполняется поверх контента.

Анимация поверх контента и лаг при скроле

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

Решение достаточно простое. Если у UIRefreshControl задан backgrounColor, т.е.

let refresh = UIRefreshControl()
refresh.backgroundColor = .systemBackground

то при возвращении UIScrollView в исходное положение анимация контрола выполняется под контентом UIScrollView.

Здесь также проблема решается просто. Не стоит добавлять контрол как, допустим:

let tableView = UITableView()
tableView.refreshControl = refreshControl

Хоть и документация от Apple описывает именно такой подход:

Необходимо контрол добавлять как subview:

let tableView = UITableView()
tableView.addSubview(refreshControl)

В этом случае при срабатывании селектора смещение контента (лаг) отсутсвует и анимация выглядит намного дружелюбнее.

Приведенные советы применимы и для UITableView, и UICollectionView, поскольку они являются наследниками UIScrollView. На этом у меня все. Всего хорошего.