IOS开发 把长度不等的UICollectionView 的cell 居左

本文介绍了如何在iOS开发中自定义一个EqualSpaceFlowLayout类,该类继承自UICollectionViewFlowLayout,以实现不同长度的cell在UICollectionView中左对齐并保持等间距的效果。通过重写`layoutAttributesForElementsInRect:`方法,调整每个cell的frame,确保在内容视图内正确显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//首先自定义一个 EqualSpaceFlowLayout的类继承于 UICollectionViewFlowLayout

//在.h文件中

@protocol  EqualSpaceFlowLayoutDelegate<UICollectionViewDelegateFlowLayout>


@end


@interface EqualSpaceFlowLayout :UICollectionViewFlowLayout



@property (nonatomic,strong)NSMutableArray *itemAttributes;



@property (nonatomic,weak)id<EqualSpaceFlowLayoutDelegate> delegate;


@end


//在.m文件中 直接粘贴下面的代码就行了

-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect

{

    NSMutableArray* attributes = [[superlayoutAttributesForElementsInRect:rect] mutableCopy];


    for(int i =1; i < [attributes count]; ++i) {

        

        

        //当前attributes

        UICollectionViewLayoutAttributes *currentLayoutAttributes = attributes[i];

        //上一个attributes

        UICollectionViewLayoutAttributes *prevLayoutAttributes = attributes[i -1];

    

//        NSLog(@"%ld  %ld", currentLayoutAttributes.indexPath.section, currentLayoutAttributes.indexPath.row);

        

        if (currentLayoutAttributes.indexPath.section == prevLayoutAttributes.indexPath.section && currentLayoutAttributes.frame.origin.x != 0
) {

           //我们想设置的最大间距,可根据需要改

            NSInteger maximumSpacing = 10;

            //前一个cell的最右边

            NSInteger origin = CGRectGetMaxX(prevLayoutAttributes.frame);

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

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

            if( origin + maximumSpacing + currentLayoutAttributes.frame.size.width <=self.collectionViewContentSize.width-10) {

                

                CGRect frame = currentLayoutAttributes.frame;

                frame.origin.x = origin + maximumSpacing;

                currentLayoutAttributes.frame = frame;

                

            }

            else {

                CGRect frame = currentLayoutAttributes.frame;

                frame.origin.x = maximumSpacing;

                frame.origin.y =CGRectGetMaxY(prevLayoutAttributes.frame) + maximumSpacing;

                currentLayoutAttributes.frame = frame;

            }


        }

    }

    return attributes;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值