美文网首页
iOS解决UICollectionView的cell间距与设置不

iOS解决UICollectionView的cell间距与设置不

作者: BabyLiu | 来源:发表于2019-05-20 14:28 被阅读0次

    在用UICollectionView展示数据时,有时我们希望将cell的间距调成一个我们想要的值,但是往往在不同设备上显示的却不能达到预期的效果。

    cell的间距是由cell的大小itemSize和section的缩进sectionInset共同决定的。可以通过UICollectionViewFlowLayout的子类对cell进行约束。

    如:

    @interface QQSquareCollectionViewFlowLayout : UICollectionViewFlowLayout

    /**

    *  初始化UICollectionViewFlowLayout对象实例

    *  @param  sectionInset    布局的内边距

    *  @param  interitemSpacing 列间距

    *  @param  lineSpacing      行间距

    *  @param  itemSize        每个item的大小

    *  @return 返回的对象实例

    */

    - (instancetype)initWithSectionInset:(UIEdgeInsets)sectionInset interitemSpacing:(CGFloat)interitemSpacing lineSpacing:(CGFloat)lineSpacing itemSize:(CGSize)itemSize;

    @end

    #import "QQSquareCollectionViewFlowLayout.h"

    @interface QQSquareCollectionViewFlowLayout ()

    /*列间距*/

    @property (nonatomic, assign) CGFloat interitemSpacing;

    /*行间距*/

    @property (nonatomic, assign) CGFloat lineSpacing;

    @end

    @implementation QQSquareCollectionViewFlowLayout

    #pragma mark - 初始化UICollectionViewFlowLayout对象实例

    - (instancetype)initWithSectionInset:(UIEdgeInsets)sectionInset interitemSpacing:(CGFloat)interitemSpacing lineSpacing:(CGFloat)lineSpacing itemSize:(CGSize)itemSize {

        self = [super init];

        if (self) {

            self.sectionInset = sectionInset;

            self.minimumInteritemSpacing = 0.f;

            self.minimumLineSpacing = lineSpacing;

            self.itemSize = itemSize;

            _interitemSpacing = interitemSpacing;

            _lineSpacing = lineSpacing;

        }

        return self;

    }

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

    NSArray *attributesArray = [super layoutAttributesForElementsInRect:rect];

    UICollectionViewLayoutAttributes *firstLayoutAttributes = [attributesArray firstObject];

        firstLayoutAttributes.frame = CGRectMake(self.sectionInset.left, firstLayoutAttributes.frame.origin.y, firstLayoutAttributes.frame.size.width, firstLayoutAttributes.frame.size.height);

        for(NSUInteger i = 1; i < attributesArray.count; ++i) {

            //当前attributes

            UICollectionViewLayoutAttributes *currentLayoutAttributes = attributesArray[i];

            //上一个attributes

            UICollectionViewLayoutAttributes *prevLayoutAttributes = attributesArray[i - 1];

            CGRect prevFrame = prevLayoutAttributes.frame;

            //前一个cell的最右边

            CGFloat prevMaxX = CGRectGetMaxX(prevFrame);

            //我们想设置的最大列间距 self.minimumLineSpacing

            //如果当前一个cell的最右边加上我们想要的间距加上当前cell的宽度依然在contentSize中,我们改变当前cell的原点位置

            //不加这个判断的后果是,UICollectionView只显示一行,原因是下面所有cell的x值都被加到第一行最后一个元素的后面了

            if(prevMaxX + self.interitemSpacing + currentLayoutAttributes.frame.size.width + self.sectionInset.right <= self.collectionViewContentSize.width) {

                CGRect frame = currentLayoutAttributes.frame;

                frame.origin.x = prevMaxX + self.interitemSpacing;

                currentLayoutAttributes.frame = frame;

            }

        }

        return attributesArray;

    }

    在控制器中使用:

    /*每个九宫格之间的间隙*/

    #define kSpace 15.f

    /*九宫格排几列*/

    #define kColumn 2

    - (UICollectionView *)collectionView {

        if (!_collectionView) {

            CGFloat space = QQHorizontalRatioValue(kSpace);

            //设置布局的内边距

            UIEdgeInsets sectionInset = UIEdgeInsetsMake(space, space, space, space);

            //设置列间距

            CGFloat interitemSpacing = space;

            //设置行间距

            CGFloat lineSpacing = space;

            //设置每个item的大小

            CGFloat itemWidth = (self.view.bounds.size.width - sectionInset.left - sectionInset.right - interitemSpacing * (kColumn - 1)) / kColumn;

            CGFloat itemHeight = itemWidth;

            CGSize itemSize = CGSizeMake(itemWidth, itemHeight);

            QQSquareCollectionViewFlowLayout *collectionViewFlowLayout = [[QQSquareCollectionViewFlowLayout alloc] initWithSectionInset:sectionInset interitemSpacing:interitemSpacing lineSpacing:lineSpacing itemSize:itemSize];

            //设置布局的滚动方向

            collectionViewFlowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;

            _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:collectionViewFlowLayout];

            _collectionView.backgroundColor = kQQViewBaseBackgroundColor;

            _collectionView.dataSource = self;

            _collectionView.delegate = self;

            _collectionView.showsHorizontalScrollIndicator = NO;

        }

        return _collectionView;

    }

    相关文章

      网友评论

          本文标题:iOS解决UICollectionView的cell间距与设置不

          本文链接:https://www.haomeiwen.com/subject/ohdkzqtx.html