我希望能够在UICollectionView中设置内容大小的最小高度,因此我可以隐藏/显示UISearchbar,类似于在iBooks上完成的方式。
但是,我不想将布局子类化,因为我想保留UICollectionView的标准垂直布局。
任何想法?
答案 0 :(得分:8)
您可以通过继承UICollectionViewFlowLayout并覆盖方法
来完成此操作-(CGSize)collectionViewContentSize
{ //Get the collectionViewContentSize
CGSize size = [super collectionViewContentSize];
if (size < minimumSize) return minimumSize;
else return size;
}
编辑: 我刚刚意识到你说你不想把布局子类化。无论如何,我将UICollectionViewFlowLayout子类化,并且只修改了collectionViewContentSize方法。它为我保留了标准的垂直布局。
修改:https://stackoverflow.com/a/14465485/2017159。在这里它说UICollectionViewFlowLayout只支持一个方向(垂直或水平),所以它应该没问题?
答案 1 :(得分:0)
您可以尝试这种快速解决方案,如果您有足够的项目来填充屏幕,搜索栏将被隐藏。当然,您可以使用任何自定义视图更改下面的UISearchBar。
collectionView.contentInset = UIEdgeInsetsMake(44.0, 0.0, 0.0, 0);
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, -44, collectionView.frame.size.width, 44)];
[collectionView addSubview:searchBar];
if([items count] != 0){
[collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] atScrollPosition:UICollectionViewScrollPositionTop animated:NO];
}
另一种完全相同的解决方案是使用补充视图。我刚走了创建UICollectionReusableView的子类,确保在流布局上设置标题引用大小
[flowLayout setHeaderReferenceSize:CGSizeMake(0, 44.0)];
使用集合视图注册补充视图
[playersCollectionView registerClass:[MySupplementaryView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"MyHeader"];
并实现UICollectioViewDataSource方法
-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
MySupplementaryView *header = nil;
if ([kind isEqual:UICollectionElementKindSectionHeader]){
header = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"MyHeader" forIndexPath:indexPath];
header.headerLabel.text = @"bla bla";
}
return header;
}
最后在每次重新加载后,在第一项的开头重新定位集合视图以隐藏searchBar /标题视图。
if([items count] != 0){
[collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] atScrollPosition:UICollectionViewScrollPositionTop animated:NO];
}
答案 2 :(得分:0)
这是khangsile答案的调整版本。 仅限制实际小于最小尺寸的尺寸
- (CGSize)collectionViewContentSize
{
CGSize size = [super collectionViewContentSize];
size.width = MAX(size.width, self.minimumContentSize.width);
size.height = MAX(size.height, self.minimumContentSize.height);
return size;
}