Я пытаюсь создать контроллер представления с представлением коллекции, который поставляется с настраиваемым закрепленным заголовком элемента управления сегментом. При нажатии на сегмент в сегментированном элементе управления данные обновляются в представлении сбора, а также сбрасывается смещение содержимого до нуля.
При этом я столкнулся с проблемой перехода панели навигации с большого на маленький и наоборот наоборот ... Как вы можете видеть здесь, переход является скачкообразным и совсем не плавным ..
Мне удалось решить эту проблему, изменив строка ниже:
edgesForExtendedLayout = []
к этому:
edgesForExtendedLayout = .all
Но добавление строки выше мешает моей попытке сбросить смещение содержимого на ноль, когда я нажимаю на сегмент в сегмент управления. Как вы можете видеть ниже:
Если в приведенном выше gif не ясно, когда я нажимаю на сегмент, представление коллекции прокручивается вместе с панель навигации ... и смещение содержимого все еще немного неправильное .. Я хочу сохранить заголовок там, где он находится до того, как сегмент был нажат, и только сбросить смещение содержимого представления коллекции.
Я также попытался установить extendedLayoutIncludesOpaqueBars
на истину и ложь, но безрезультатно. Я также попытался поиграть с contentInsetAdjustmentBehavior
в режиме просмотра коллекции, но мне не очень повезло.
Вот код, где я настраиваю представление.
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .white
self.navigationController?.navigationBar.prefersLargeTitles = true
self.navigationItem.title = "Sticky Section Headers"
self.edgesForExtendedLayout = .all
self.extendedLayoutIncludesOpaqueBars = true
self.navigationItem.searchController = UISearchController()
setUpNavBarAppearance()
setUpCollectionView()
configureDataSource()
}
func setUpCollectionView() {
let collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: layout())
collectionView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
collectionView.backgroundColor = .systemBackground
collectionView.register(ListCell.self, forCellWithReuseIdentifier: ListCell.reuseIdentifier)
collectionView.register(SegmentedControlSupplementaryView.self,
forSupplementaryViewOfKind: sectionHeaderElementKind,
withReuseIdentifier: SegmentedControlSupplementaryView.reuseIdentifier)
self.view.addSubview(collectionView)
collectionView.refreshControl = refreshControl
self.collectionView = collectionView
}
Это то, что я делаю, когда я нажимаю на сегмент в элементе управления сегментом.
@objc func segmentChanged() {
self.collectionView?.setContentOffset(.zero, animated: true)
}
Я также пытался использовать scrollTo
методы в представлении коллекции, но результат был таким же .. Я также пытался установить границы представления коллекции для безопасных направляющих макетов верхней и нижней привязок ... это не помогло многое либо ..
Вот файл gist с полным кодом для просмотра на случай, если вы захотите его попробовать. https://gist.github.com/prasadpamidi/829e636d4697fda025bb0795ee81e355
Существует не так много документации или рекомендаций относительно того, как сделать это должным образом. Мне удалось воспроизвести это с самим образцом приложения Apple.
Оцените любая помощь в решении этой проблемы ..