为UICollectionView设置最小内容大小

时间:2013-04-03 12:46:46

标签: uicollectionview contentsize

我希望能够在UICollectionView中设置内容大小的最小高度,因此我可以隐藏/显示UISearchbar,类似于在iBooks上完成的方式。

但是,我不想将布局子类化,因为我想保留UICollectionView的标准垂直布局。

任何想法?

3 个答案:

答案 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];
}

补充观点教程techotopia.comappcode.commobinius

答案 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;
}