Контент CollectionView под панелью навигации

Я хочу, чтобы содержимое collectionView начиналось с самого верха экрана (вверху строки состояния), потому что у меня прозрачная панель навигации, я хочу избежать магических чисел, и она должна работать с iPhone X и другие айфоны.

Что я пробовал?

collectionView.contentInset = UIEdgeInsets(top: -64, left: 0, bottom: 0, right: 0)

но это не изящное решение, и оно не подходит для iPhone X, нужно увеличить вставку

Любое чистое решение?

Таргетинг на iOS 10 и 11


person iOSGeek    schedule 11.12.2017    source источник
comment
установите UICollectionView top 0 с помощью основного представления. Нет необходимости устанавливать contentInset.   -  person Ujesh    schedule 11.12.2017


Ответы (3)


Добавьте это в UIViewController, содержащий UICollectionView, чтобы представление коллекции не попало под панель навигации. Например. в методе viewDidLoad:

Swift 4

self.edgesForExtendedLayout = UIRectEdge.bottom

Вы даже можете установить edgesForExtendedLayout = [], чтобы представление коллекции тоже не попадало в UITabBars.

person FBente    schedule 22.02.2018
comment
Это сработало для меня, но, кроме того, мне пришлось использовать -64 (панель навигации + строка состояния) в качестве значения для ограничения в представлении коллекции с использованием верхней безопасной области. - person valdyr; 23.04.2018

Для Swift 5 Попробуйте это

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true

а на вкладке инспектора размера IB установите для «Вставки содержимого» значение «Никогда».

person Suresh Reddy    schedule 29.07.2019

Если вы используете построитель интерфейсов, это можно легко сделать, установив для ограничения верхнего пространства представления коллекции значение 0 constant из superview и не из safe area.

        view.addSubview(collectionView)
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
        collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
        collectionView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 0).isActive = true
        collectionView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: 0).isActive = true

Учтите, что этот подход будет работать на iOS11, но вылетит на iOS10. Это потому, что я все еще использую безопасную область для начала и конца, безопасная область недоступна в iOS10. Используя Xcode 9 и конструктор интерфейса, вы получаете бесплатное преобразование из безопасной области в руководства по макету.

person Andrea    schedule 11.12.2017
comment
это возможно с кодом? Я использую SnapKit, но могу использовать систему компоновки собственного кода - person iOSGeek; 11.12.2017
comment
Я никогда не использовал snapkit, но это может быть что-то подобное с использованием API автоматической компоновки, я обновил ответ - person Andrea; 11.12.2017