默认情况下在 UICollectionView 中滚动 UISearchBar
Posted
技术标签:
【中文标题】默认情况下在 UICollectionView 中滚动 UISearchBar【英文标题】:Scrolling off UISearchBar in a UICollectionView by default 【发布时间】:2013-01-24 20:57:21 【问题描述】:我正在开发一个使用 UICollectionView(实际上是 PSUICollectionView)的项目,并且我在这个集合视图的顶部添加了一个 UISearchBar。我现在想做的是默认滚动此搜索栏,直到用户将其拉下。这种行为在 UITableView 中很容易实现,但是 UICollectionView 的 contentSize 直到 viewDidAppear 才被初始化!所以将 contentOffset 的 Y 设置为搜索栏高度没有任何效果,除非它是在 viewDidAppear 中完成的(这不是我想要的)。有没有人想出将 UISearchBar 与 UICollectionView 一起使用,以及如何让它在默认情况下保持滚动?
谢谢! -阿米特
【问题讨论】:
我在这里回答了类似的问题***.com/questions/15787754/… 【参考方案1】:我的问题没有得到任何答复,但我会发布我最终完成的工作。我使用了滚动视图并将搜索栏和集合视图作为子视图添加到滚动视图。这是解决方案的关键,但实际上让它运作良好是相当棘手的。将集合视图添加为子视图时,您必须做的是使其框架高度与其 contentSize 相同。这确保集合视图本身不会滚动,而超级视图将处理滚动。要记住的另一件事是,与 UITableView 不同,UICollectionView 对象在 viewDidAppear 之前不会更新其 contentSize。所以我不得不在 viewWillAppear 中设置一个假的 frame 和 contentSize,然后在 viewDidAppear 中重新调整。
【讨论】:
【参考方案2】:在我看来,集合视图添加到其集合视图控制器的方式或另一个视图控制器呈现集合视图控制器的方式有问题。您是否使用任何自定义视图控制器容器?如果是这样,请务必通知 childViewControllers(如您的 collectionView)它已添加到父级。
如果这些都不是,那么可能是您在到达 viewDidAppear 之前没有加载数据对象。如果您将它们手动加载到数组中,您何时调用 reloadData?如果您使用的是 NSFetchedResultsController,请在视图出现之前检查您是否已获取对象,因为它们是计算 contentSize 所必需的。
您是否继承了 UICollectionViewFlowLayout?如果是这样,是在视图出现之前调用 prepareLayout 吗?
答案不多,但听起来您的问题可能出在多个地方。
【讨论】:
【参考方案3】:我通过添加延迟然后调用此方法做了类似的事情:
[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UICollectionViewScrollPositionTop animated:YES];
【讨论】:
【参考方案4】:这个解决方案对我有用
1.确保您先点击
2.自定义类
3.给出一个标识符
4.
-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
viewForSupplementaryElementOfKind:(NSString *)kind
atIndexPath:(NSIndexPath *)indexPath
return [self.imageCollection dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"collectionViewHeader" forIndexPath:indexPath];
5.在故事板上添加搜索栏到标题部分。
应该可以!
【讨论】:
【参考方案5】:我最终使用了这个技巧:
调整 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;
【讨论】:
【参考方案6】:我的解决方案:
在viewDidLoad
中最初通过设置contentInset
的top
来隐藏搜索栏:
self.collectionView.contentInset = UIEdgeInsetsMake(-56.0, 0.0, 0.0, 0.0)
当用户向下滚动超过阈值时,清除 contentInset
以显示搜索栏:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
if (scrollView.contentOffset.y < -30.0)
[UIView animateWithDuration:0.25 animations:^
self.collectionView.contentInset = UIEdgeInsetsZero;
];
【讨论】:
以上是关于默认情况下在 UICollectionView 中滚动 UISearchBar的主要内容,如果未能解决你的问题,请参考以下文章
为啥 minifyEnabled 在默认情况下在发布版本中为 false?