• UICollectionView中Cell左对齐 居中 右对齐 等间距------你想要的,这里都有


    支持靠左,居中,靠右,等间距对齐。

    靠左等间距.png
    靠左等间距.png
    居中等间距.png
    居中等间距.png
    靠右等间距.png
    靠右等间距.png
    #import <UIKit/UIKit.h>
    
    typedef NS_ENUM(NSInteger,AlignType){
        AlignWithLeft,
        AlignWithCenter,
        AlignWithRight
    };
    
    @interface EqualSpaceFlowLayoutEvolve : UICollectionViewFlowLayout
    //两个Cell之间的距离
    @property (nonatomic,assign)CGFloat betweenOfCell;
    //cell对齐方式
    @property (nonatomic,assign)AlignType cellType;
    
    -(instancetype)initWthType : (AlignType)cellType;
    
    @end
    
    #import "EqualSpaceFlowLayoutEvolve.h"
    
    @interface EqualSpaceFlowLayoutEvolve(){
        //在居中对齐的时候需要知道这行所有cell的宽度总和
        CGFloat _sumWidth ;
    }
    @end
    
    @implementation EqualSpaceFlowLayoutEvolve
    
    -(instancetype)init{
        self = [super init];
        if (self){
            self.scrollDirection = UICollectionViewScrollDirectionVertical;
            self.minimumLineSpacing = 5;
            self.minimumInteritemSpacing = 5;
            self.sectionInset = UIEdgeInsetsMake(5, 5, 5, 5);
            _betweenOfCell = 5.0;
            _cellType = AlignWithLeft;
        }
        return self;
    }
    
    -(instancetype)initWthType:(AlignType)cellType{
        self = [super init];
        if (self){
            self.scrollDirection = UICollectionViewScrollDirectionVertical;
            self.minimumLineSpacing = 5;
            self.minimumInteritemSpacing = 5;
            self.sectionInset = UIEdgeInsetsMake(5, 5, 5, 5);
            _betweenOfCell = 5.0;
            _cellType = cellType;
        }
        return self;
    }
    -(void)setBetweenOfCell:(CGFloat)betweenOfCell{
        _betweenOfCell = betweenOfCell;
        self.minimumInteritemSpacing = betweenOfCell;
    }
    - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
        NSArray * layoutAttributes_t = [super layoutAttributesForElementsInRect:rect];
        NSArray * layoutAttributes = [[NSArray alloc]initWithArray:layoutAttributes_t copyItems:YES];
        //用来临时存放一行的Cell数组
        NSMutableArray * layoutAttributesTemp = [[NSMutableArray alloc]init];
        for (NSUInteger index = 0; index < layoutAttributes.count ; index++) {
            
            UICollectionViewLayoutAttributes *currentAttr = layoutAttributes[index]; // 当前cell的位置信息
            UICollectionViewLayoutAttributes *previousAttr = index == 0 ? nil : layoutAttributes[index-1]; // 上一个cell 的位置信
            UICollectionViewLayoutAttributes *nextAttr = index + 1 == layoutAttributes.count ?
            nil : layoutAttributes[index+1];//下一个cell 位置信息
            
            //加入临时数组
            [layoutAttributesTemp addObject:currentAttr];
            _sumWidth += currentAttr.frame.size.width;
            
            CGFloat previousY = previousAttr == nil ? 0 : CGRectGetMaxY(previousAttr.frame);
            CGFloat currentY = CGRectGetMaxY(currentAttr.frame);
            CGFloat nextY = nextAttr == nil ? 0 : CGRectGetMaxY(nextAttr.frame);
            //如果当前cell是单独一行
            if (currentY != previousY && currentY != nextY){
                if ([currentAttr.representedElementKind isEqualToString:UICollectionElementKindSectionHeader]) {
                    [layoutAttributesTemp removeAllObjects];
                    _sumWidth = 0.0;
                }else if ([currentAttr.representedElementKind isEqualToString:UICollectionElementKindSectionFooter]){
                    [layoutAttributesTemp removeAllObjects];
                    _sumWidth = 0.0;
                }else{
                    [self setCellFrameWith:layoutAttributesTemp];
                }
            }
            //如果下一个不cell在本行,则开始调整Frame位置
            else if( currentY != nextY) {
                [self setCellFrameWith:layoutAttributesTemp];
            }
        }
        return layoutAttributes;
    }
    
    -(void)setCellFrameWith:(NSMutableArray*)layoutAttributes{
        CGFloat nowWidth = 0.0;
        switch (_cellType) {
            case AlignWithLeft:
                nowWidth = self.sectionInset.left;
                for (UICollectionViewLayoutAttributes * attributes in layoutAttributes) {
                    CGRect nowFrame = attributes.frame;
                    nowFrame.origin.x = nowWidth;
                    attributes.frame = nowFrame;
                    nowWidth += nowFrame.size.width + self.betweenOfCell;
                }
                _sumWidth = 0.0;
                [layoutAttributes removeAllObjects];
                break;
            case AlignWithCenter:
                nowWidth = (self.collectionView.frame.size.width - _sumWidth - (layoutAttributes.count * _betweenOfCell)) / 2;
                for (UICollectionViewLayoutAttributes * attributes in layoutAttributes) {
                    CGRect nowFrame = attributes.frame;
                    nowFrame.origin.x = nowWidth;
                    attributes.frame = nowFrame;
                    nowWidth += nowFrame.size.width + self.betweenOfCell;
                }
                _sumWidth = 0.0;
                [layoutAttributes removeAllObjects];
                break;
                
            case AlignWithRight:
                nowWidth = self.collectionView.frame.size.width - self.sectionInset.right;
                for (NSInteger index = layoutAttributes.count - 1 ; index >= 0 ; index-- ) {
                    UICollectionViewLayoutAttributes * attributes = layoutAttributes[index];
                    CGRect nowFrame = attributes.frame;
                    nowFrame.origin.x = nowWidth - nowFrame.size.width;
                    attributes.frame = nowFrame;
                    nowWidth = nowWidth - nowFrame.size.width - _betweenOfCell;
                }
                _sumWidth = 0.0;
                [layoutAttributes removeAllObjects];
                break;
                
        }
    }
    
    @end
  • 相关阅读:
    poj 2112
    写给学大计python的同学的查错方法
    [Win32 API学习] Edit,ListBox的用法,字体的设置
    [Win32 API] FindFirstFile()和FindNextFile()
    初探C++ win32 api——Hello world!
    [学习笔记]舞蹈链(DLX)(C++指针版)
    2020科大回归记
    SCOI2019AFO记
    [学习笔记]动态动态规划/动态DP/DDP
    BZOJ5343[CTSC2018]混合果汁(二分答案+主席树)
  • 原文地址:https://www.cnblogs.com/liangyi-cn/p/7520387.html
Copyright © 2020-2023  润新知