Как скрыть / показать вид, прикрепленный к вершине collectionView

Я разрабатываю приложение, которое имеет collectionView с ячейками, а также searchController внутри представления. Иерархия представления выглядит следующим образом:

А также я использую autoLayout следующим образом:

TagsCollection - это представление коллекции, которое имеет высоту = 0 и расширяется (по высоте) только тогда, когда пользователь использует параметр фильтра (поскольку он содержит теги, которые пользователь использовал для фильтра)

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

До сих пор это решение работало нормально. Вид поиска был прикреплен к вершине. TagCollectionView был сразу после этого представления, а CollectionView был сразу после тегов. Но теперь я хочу скрыть de searchBar под навигационной панелью и использовать скроллвью коллекции collectionView, чтобы показать / скрыть панель поиска.

Мне удалось сделать это с помощью ограничений программным путем, обновляя constraint.constant при перемещении scrollView. это хорошо работает в главном сценарии, но в других резко терпит неудачу.

Это рабочий пример того, что я делаю в основном сценарии (основной сценарий: в collectionView есть ячейки, и scrollView.contentSize.height больше, чем scrollView.frame.height, то есть больше ячеек, чем те, которые могут вписаться в вид)

Как мне это сделать:

Это рабочий код:

var isSearchBarCompletedShowed:Bool {
        get {
            if topSearchBarContainerConstraint.constant == 0 {
                return true
            } else if topSearchBarContainerConstraint.constant == startSearchBarPoint {
                return false
            } else {
                return true
            }
        }
    }
var lastContentOffset:CGFloat = 0.0
var startSearchBarPoint:CGFloat = 0.0
var endSearchBarPoint:CGFloat = 0.0

@IBOutlet var topSearchBarContainerConstraint: NSLayoutConstraint!

override func viewDidLoad() {
    super.viewDidLoad()
    if showSearchFilter() {
        topSearchBarContainerConstraint.constant = -searchController.searchBar.frame.height // update the constraint to move the searchview up for exactly is height (so its appear below the navigationBar)
        startSearchBarPoint = -searchController.searchBar.frame.height // the top point of the searchbar
        endSearchBarPoint = 0 // The bottom point of the searchBar
    }
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    // ScrollDown
    if (lastContentOffset > scrollView.contentOffset.y) && lastContentOffset < (scrollView.contentSize.height - scrollView.frame.height) {
        if (scrollView.contentOffset.y < endSearchBarPoint) && (topSearchBarContainerConstraint.constant < 0) {
                topSearchBarContainerConstraint.constant += -scrollView.contentOffset.y
        }
        if (topSearchBarContainerConstraint.constant > 0) {
            topSearchBarContainerConstraint.constant = 0
        }
    } else if (lastContentOffset < scrollView.contentOffset.y && scrollView.contentOffset.y > 0) {
        print("Going up..")
        if isSearchBarCompletedShowed {
            if (abs(scrollView.contentOffset.y) < abs(startSearchBarPoint)) {
                topSearchBarContainerConstraint.constant = -scrollView.contentOffset.y
            } else {
                topSearchBarContainerConstraint.constant = -abs(startSearchBarPoint)
            }
        }
    }
    lastContentOffset = scrollView.contentOffset.y
}

Но в других сценариях этот подход просто не работает. Например, что происходит, когда ячеек недостаточно, чтобы расширить представление за рамкой. Тогда searchBar просто не отображается, потому что (lastContentOffset < (scrollView.contentSize.height - scrollView.frame.height)) поэтому представление searchBar никогда не появится..

Рабочий пример:

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

Рабочий пример:

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

Большое вам спасибо, и если вам нужно больше деталей, не стесняйтесь спрашивать

С уважением (и счастливого нового года!:D)

0 ответов

Другие вопросы по тегам