默认情况下,在UICollectionView中滚动UISearchBar

时间:2013-01-24 20:57:22

标签: uiscrollview uicollectionview contentoffset

我正在开发一个使用UICollectionView(实际上是PSUICollectionView)的项目,并在此集合视图的顶部添加了一个UISearchBar。我现在想做的是默认滚动此搜索栏,直到用户将其拉下来。在UITableView中这种行为很容易,但是在viewDidAppear之前,UICollectionView的contentSize甚至都没有初始化!因此,将contentOffset的Y设置为搜索栏高度无效,除非在viewDidAppear中完成(这不是我想要的)。是否有人想到使用带有UICollectionView的UISearchBar以及如何在默认情况下将其保持滚动状态?

谢谢! -Amit

6 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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

[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UICollectionViewScrollPositionTop animated:YES];

答案 3 :(得分:0)

此解决方案适合我

1.确保先点击

2.Custom Class

3.给出一个标识符

enter image description here

4

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

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

应该工作!

答案 4 :(得分:0)

我最终使用了这个技巧:

调整viewdidload中的inset并在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;
    }
}

答案 5 :(得分:0)

我的解决方案:

  1. viewDidLoad中,最初通过设置contentInset的{​​{1}}来隐藏搜索栏:

    top

  2. 当用户向下滚动超过阈值时,请清除self.collectionView.contentInset = UIEdgeInsetsMake(-56.0, 0.0, 0.0, 0.0)以显示搜索栏:

    contentInset