Большой переход заголовка навигации не является плавным при прокрутке - PullRequest
1 голос
/ 02 мая 2020

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

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

enter image description here

Мне удалось решить эту проблему, изменив строка ниже:

edgesForExtendedLayout = []

к этому:

edgesForExtendedLayout = .all

Но добавление строки выше мешает моей попытке сбросить смещение содержимого на ноль, когда я нажимаю на сегмент в сегмент управления. Как вы можете видеть ниже:

enter image description here

Если в приведенном выше 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.

Оцените любая помощь в решении этой проблемы ..

...