Как добавить элемент управления обновлением на панель навигации с большими заголовками коллекции в iOS 11?

Согласно Apple, элемент управления обновлением должен быть частью большой панели навигации заголовка в iOS 11.

Элемент управления обновлением является частью панели навигации (по запросу для обновления), когда я включил элемент управления обновлением в своей раскадровке для UITableViewController.

управление обновлением с крупными заголовками

Я не могу сделать это в раскадровке для всех других представлений, таких как UICollectionViewController. Когда я добавляю элемент управления обновлением в код в качестве подвида, он не является частью панели навигации:

refreshControl = UIRefreshControl()
collectionView?.addSubview(refreshControl)

Хотя это выглядит так:

хотя выглядит так

Как добавить элемент управления обновлением в свое пользовательское представление прокрутки, например UICollectionViewController, таким образом, чтобы элемент управления обновлением отображался на панели навигации при использовании больших заголовков?


person funkenstrahlen    schedule 06.07.2017    source источник
comment
Добавьте весь вид в UIScrollView, а затем добавьте UIRefreshControl в качестве подвида scrollView.   -  person kamwysoc    schedule 06.07.2017
comment
Итак, хитрость заключается в том, чтобы добавить UIRefreshControl не как подвид UICollectionView, а как подвид UIScrollView?   -  person funkenstrahlen    schedule 06.07.2017
comment
О, я вижу, что UICollectionView уже является UIScrollView.   -  person funkenstrahlen    schedule 06.07.2017
comment
В этом-то и дело :)   -  person kamwysoc    schedule 06.07.2017
comment
Значит, я делаю это правильно. Почему тогда не работает? Я добавил изображение выше, демонстрирующее, как это выглядит.   -  person funkenstrahlen    schedule 06.07.2017


Ответы (3)


Начиная с iOS 10, UITableView и UICollectionView имеют свойство refreshControl.

Итак, вместо:

tableView.addSubview(refreshControl)

ты сделаешь:

tableView.refreshControl = refreshControl

и это должно работать для новых больших заголовков в iOS 11.

person Martin    schedule 27.07.2017
comment
Я не знал, что это было добавлено в iOS 10. Спасибо, что показали мне! Работает отлично! - person funkenstrahlen; 06.08.2017
comment
Обратите внимание, что это будет работать правильно только в том случае, если контроллер табличного представления настроен на расширение за панелью навигации. У меня было представление таблицы, которое не выходило за панель навигации, и я получил огромный беспорядок. - person matt; 04.09.2017
comment
@matt хм, никогда не пробовал так. Спасибо, что упомянули об этом, я попробую, потому что мне любопытно, что за беспорядок :D - person Martin; 05.09.2017
comment
Я не мог заставить его работать с обычным UIViewController, который имеет полноэкранный tableView (никакой разницы с UITableViewController, просто более управляемый). Элемент управления обновлением просто исчезает. Мне пришлось добавить пустой вид за столом, чтобы вернуть старую функциональность. - person Bruno Rocha; 04.10.2017
comment
Стоит отметить, что свойство refreshControl на самом деле относится к UIScrollView, надклассу как UITableView, так и UICollectionView. - person Jessedc; 04.12.2017
comment
@matt Что вы сделали, чтобы избавиться от огромного пробела над большим заголовком при использовании контроллера обновления? - person Aaron Bratcher; 17.01.2018
comment
@AaronBratcher В основном это, вероятно, связано с тем, что вы неправильно выполняете нижнее перекрытие табличного представления под панелью навигации. Вы можете задать отдельный вопрос, если вам нужна более подробная помощь. - person matt; 18.01.2018
comment
@matt У меня табличное представление, которое не находится непосредственно под панелью навигации. Между ними находится поле поиска. Итак, как я могу установить управление обновлением для этого табличного представления? Также моя панель навигации имеет индивидуальную высоту (около 100pt). - person krishnanunni; 28.02.2018

EDIT: в какой-то момент документация была обновлена, и приведенная ниже информация больше не соответствует действительности.

Как указано Apple в документации UIRfreshControl.

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

Если ваш VC является UITableViewController, он будет работать точно так же, как и в системных приложениях.

person Michał Kałużny    schedule 25.07.2017
comment
Вы спасли мой день! Я не понимал, почему у меня было глючное поведение при обновлении. Это было потому, что мой контроллер был UIViewController, а не UITableViewController. Теперь это работает как шарм! - person Grifas; 26.02.2018
comment
Где именно это сказано? - person powerj1984; 03.05.2018
comment
Согласно документации UIRefreshControl, это уже не так. - person Raghav; 26.07.2018
comment
Похоже, это все еще так. Использование обычного UIViewController с табличным представлением приводит к глючному/мерцающему элементу управления обновлением. Использование UITableViewController устраняет проблему. Документация изменилась, но неопределенное поведение сохраняется. - person Casey Wagner; 24.08.2018

В моем случае я хотел, чтобы UIView был ниже UITableView, поэтому UITableView не было первым подпредставлением контроллера представления view.

Чтобы исправить это, я изменил порядок UITableView и других UIView.

от

введите здесь описание изображения

to

введите здесь описание изображения

Теперь я просто установил zPosition своего представления на более низкое значение, чем zPosition UITableView, что должно сделать мое представление похожим на UITableView.

myView.layer.zPosition = -1

person Robert Dresler    schedule 18.10.2020