如果只有一个单元格,则该单元格位于集合视图的中心

时间:2019-04-12 16:14:09

标签: ios objective-c uicollectionview autolayout

我想从左到右排列单元格。所以我使用UICollectionViewFlowLayout

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
// use this for let cell width fit for label width
layout.estimatedItemSize = CGSizeMake(80, 30);
self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:layout];

单元格的宽度适合标签的宽度:

// cell code
@implementation CQGoodsSearchCell

- (void)setupUI {
    self.contentView.layer.cornerRadius = 15;
    self.contentView.layer.masksToBounds = YES;
    self.contentView.backgroundColor = [UIColor colorWithRed:1.00 green:1.00 blue:1.00 alpha:1.00];

    self.nameLabel = [[UILabel alloc] init];
    [self.contentView addSubview:self.nameLabel];
    self.nameLabel.font = [UIFont systemFontOfSize:15];
    self.nameLabel.textColor = [UIColor colorWithRed:0.18 green:0.18 blue:0.18 alpha:1.00];
    [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.height.mas_equalTo(30);
        make.top.bottom.mas_offset(0);
        make.left.mas_offset(10);
        make.right.mas_offset(-10);
    }];
}

一个细胞以上时,一切都会顺利进行:

Two cells aligned to the left

但是,只有一个单元格时,该单元格位于中心:

One cell in the center

如果我使用itemSize而不是estimatedItemSize,就可以了:

layout.itemSize = CGSizeMake(80, 30);

Once cell aligned to the left

对此我真的很困惑。将单元格置于集合视图的中心不是我想要的,但我也想使用“自动布局”,以便单元格的宽度自行调整。

那么有什么办法可以避免这种情况?

3 个答案:

答案 0 :(得分:4)

在“估计大小”选项中选择none。如果集合视图只有一项,则它将左对齐而不是居中。

enter image description here

答案 1 :(得分:1)

基本上,这是我在这里讨论的相同问题:

https://stackoverflow.com/a/52428617/341994

总而言之,您要使用的功能自动调整尺寸的收藏视图单元格无效,并且从未使用过。就像您正确说的那样,这就是为什么

  

如果我使用itemSize而不是estimatedItemSize,就可以了

是的!这不是您的错误;这是一个iOS错误。自定义尺寸的收集视图单元不起作用。应用程序崩溃或流布局不正确。

这就是解决方案。请勿使用estimatedItemSize。而是自己计算正确的大小,并在

的实现中提供
func collectionView(_ collectionView: UICollectionView, 
    layout collectionViewLayout: UICollectionViewLayout, 
    sizeForItemAt indexPath: IndexPath) -> CGSize {
        // calculate/obtain correct size and return it
}

答案 2 :(得分:0)

此外,使用自定义$(document).ready(function(){ $(".filter-button").click(function(){ var value = $(this).attr('data-filter'); if(value == "all") { //$('.filter').removeClass('hidden'); $('.filter').show('1000'); } else { // $('.filter[filter-item="'+value+'"]').removeClass('hidden'); // $(".filter").not('.filter[filter-item="'+value+'"]').addClass('hidden'); $(".filter").not('.'+value).hide('3000'); $('.filter').filter('.'+value).show('3000'); } }); if ($(".filter-button").removeClass("active")) { $(this).removeClass("active"); } $(this).addClass("active"); }); 可以解决此问题:

对于Objective-C:

UICollectionViewLayout

对于Swift:

@interface CQLeftSideLayout : UICollectionViewFlowLayout

@end

@implementation CQLeftSideLayout

- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {

    NSArray *attributes = [super layoutAttributesForElementsInRect:rect];

    if (attributes.count == 1) {
        UICollectionViewLayoutAttributes *currentAttributes = attributes.firstObject;
        currentAttributes.frame = CGRectMake(self.sectionInset.left, currentAttributes.frame.origin.y, currentAttributes.frame.size.width, currentAttributes.frame.size.height);
    }

    return attributes;

}

@end