0

我正在开发一个使用 UICollectionView(实际上是 PSUICollectionView)的项目,并且我在这个集合视图的顶部添加了一个 UISearchBar。我现在想做的是默认滚动这个搜索栏,直到用户把它拉下来。这种行为在 UITableView 中很容易实现,但是 UICollectionView 的 contentSize 直到 viewDidAppear 才被初始化!所以将 contentOffset 的 Y 设置为搜索栏高度没有任何效果,除非它是在 viewDidAppear 中完成的(这不是我想要的)。有人想出将 UISearchBar 与 UICollectionView 一起使用,以及如何使其默认滚动关闭吗?

谢谢!-阿米特

4

6 回答 6

0

我通过添加延迟然后调用此方法做了类似的事情:

[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UICollectionViewScrollPositionTop animated:YES];
于 2013-03-07T00:29:51.720 回答
0

这个解决方案对我有用

1.确保你先点击

2.自定义类

3.给出一个标识符

在此处输入图像描述

4.

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

5.在故事板上添加搜索栏到标题部分。

应该管用!

于 2013-12-14T17:24:42.297 回答
0

我最终使用了这个技巧:

调整 viewdidload 中的插图并在 viewdidappear 中重新设置它,并设置它们的内容。

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;
    }
}
于 2014-06-24T11:13:17.530 回答
0

我的问题没有得到任何回应,但我会发布我最终完成的事情。我使用了滚动视图并将搜索栏和集合视图作为子视图添加到滚动视图。这是解决方案的关键,但实际上让它运作良好是相当棘手的。将集合视图添加为子视图时,您必须做的是使其框架高度与其 contentSize 相同。这确保集合视图本身不会滚动,而超级视图将处理滚动。要记住的另一件事是,与 UITableView 不同,UICollectionView 对象在 viewDidAppear 之前不会更新其 contentSize。所以我不得不在viewWillAppear中设置一个假的frame和contentSize,然后在viewDidAppear中重新调整。

于 2013-02-04T23:03:19.450 回答
0

在我看来,无论是将集合视图添加到其集合视图控制器的方式还是另一个视图控制器呈现该集合视图控制器的方式都有问题。您是否使用任何自定义视图控制器容器?如果是这样,请务必通知 childViewControllers(如您的 collectionView)它已添加到父级。

如果这些都不是,那么可能是您在到达 viewDidAppear 之前没有加载数据对象。如果您将它们手动加载到数组中,您何时调用 reloadData?如果您使用 NSFetchedResultsController 在视图出现之前检查您是否已获取对象,因为需要它们来计算 contentSize。

您是否继承了 UICollectionViewFlowLayout?如果是这样,是在视图出现之前调用 prepareLayout 吗?

答案不多,但听起来您的问题可能出在几个地方。

于 2013-02-08T06:01:44.057 回答
0

我的解决方案:

  1. viewDidLoad最初通过设置contentInset's隐藏搜索栏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; }]; } }

于 2018-04-09T21:43:07.237 回答