Прокрутка UISearchBar в UICollectionView по умолчанию

Я работаю над проектом, который использует UICollectionView (на самом деле PSUICollectionView), и я добавил UISearchBar вверху этого представления коллекции. Что я сейчас хочу сделать, так это прокрутить эту панель поиска по умолчанию, пока пользователь не потянет ее вниз. Такое поведение очень легко реализовать в UITableView, однако contentSize UICollectionView даже не инициализируется до тех пор, пока viewDidAppear!! Таким образом, установка ContentOffset Y на высоту панели поиска не имеет никакого эффекта, если только это не сделано в viewDidAppear (чего я не хочу). Кто-нибудь понял, как использовать UISearchBar с UICollectionView и как по умолчанию прокручивать его?

Спасибо! -Амит


person amit    schedule 24.01.2013    source источник
comment
Я ответил на аналогичную проблему здесь stackoverflow.com/questions/15787754 /   -  person michael23    schedule 10.04.2013


Ответы (6)


Я не получил ответа на свой вопрос, но я опубликую то, что я, наконец, сделал. Я использовал прокрутку и добавил панель поиска и представление коллекции в качестве подвидов прокрутки. Это суть решения, но на самом деле заставить его работать хорошо довольно сложно. Что вам нужно сделать при добавлении представления коллекции в качестве подпредставления, так это сделать его высоту кадра такой же, как и его contentSize. Это гарантирует, что представление коллекции не прокручивается само по себе, а суперпредставление будет обрабатывать прокрутку. Еще одна вещь, которую следует иметь в виду, это то, что в отличие от UITableView, объекты UICollectionView не обновляют свой contentSize до viewDidAppear. Поэтому мне пришлось установить поддельный фрейм и contentSize в viewWillAppear, а затем перенастроить в viewDidAppear.

person amit    schedule 04.02.2013

Мне кажется, что что-то не так либо с тем, как представление коллекции было добавлено в его контроллер представления коллекции, либо с тем, как этот контроллер представления коллекции представлен другим контроллером представления. Используете ли вы какое-либо пользовательское сдерживание контроллера представления? Если это так, обязательно уведомите childViewControllers (например, ваш collectionView), что он был добавлен к родителю.

Если ни один из них, возможно, ваши объекты данных не загружены до того, как вы достигнете viewDidAppear. Если вы загружаете их вручную в массив, когда вы вызываете reloadData? Если вы используете NSFetchedResultsController, убедитесь, что у вас есть fetchedObjects до появления представления, так как они необходимы для вычисления contentSize.

Вы создали подкласс UICollectionViewFlowLayout? Если да, вызывает ли он prepareLayout до появления представления?

Не очень много ответа, но похоже, что ваша проблема может быть в нескольких местах.

person ChrHansen    schedule 08.02.2013

Я сделал то же самое, добавив задержку, а затем вызвав этот метод:

[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UICollectionViewScrollPositionTop animated:YES];
person John Tubert    schedule 07.03.2013

Это решение сработало для меня

1. Убедитесь, что вы нажимаете первым

2.Пользовательский класс

3. Дайте идентификатор

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

4.

-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
          viewForSupplementaryElementOfKind:(NSString *)kind
                                atIndexPath:(NSIndexPath *)indexPath
{
    return [self.imageCollection dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"collectionViewHeader" forIndexPath:indexPath];
}

5. В раскадровке добавьте панель поиска в заголовок.

Должно сработать!

person royemi    schedule 14.12.2013

В итоге я использую этот трюк:

Отрегулируйте вставку в viewdidload и снова сбросьте ее в viewdidappear, а также установите их contentoffet.

ViewDidLoad:

[self.mainCollectionView setContentInset:UIEdgeInsetsMake(-44, 0, 0, 0)];
firstTime = TRUE;

ViewDidAppear:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];


    if (firstTime) {
        [self.mainCollectionView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)];
        [self.mainCollectionView setContentOffset:CGPointMake(0, 44)];
        firstTime = FALSE;
    }
}
person Sjoerd Perfors    schedule 24.06.2014

Мое решение:

  1. В viewDidLoad изначально скройте панель поиска, установив contentInset в top:

    self.collectionView.contentInset = UIEdgeInsetsMake(-56.0, 0.0, 0.0, 0.0)

  2. Когда пользователь прокручивает вниз пороговое значение, снимите contentInset, чтобы открыть панель поиска:

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (scrollView.contentOffset.y < -30.0) { [UIView animateWithDuration:0.25 animations:^{ self.collectionView.contentInset = UIEdgeInsetsZero; }]; } }

person Rivera    schedule 09.04.2018