我正在开发一个使用UICollectionView(实际上是PSUICollectionView)的项目,并在此集合视图的顶部添加了一个UISearchBar。我现在想做的是默认滚动此搜索栏,直到用户将其拉下来。在UITableView中这种行为很容易,但是在viewDidAppear之前,UICollectionView的contentSize甚至都没有初始化!因此,将contentOffset的Y设置为搜索栏高度无效,除非在viewDidAppear中完成(这不是我想要的)。是否有人想到使用带有UICollectionView的UISearchBar以及如何在默认情况下将其保持滚动状态?
谢谢! -Amit
答案 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.给出一个标识符
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)
我的解决方案:
在viewDidLoad
中,最初通过设置contentInset
的{{1}}来隐藏搜索栏:
top
当用户向下滚动超过阈值时,请清除self.collectionView.contentInset = UIEdgeInsetsMake(-56.0, 0.0, 0.0, 0.0)
以显示搜索栏:
contentInset