zoukankan      html  css  js  c++  java
  • 实现类似微信表情包横向滚动翻页的功能,运用UICollectionView,自定义UICollectionViewFlowLayout,cell左右排版 ,支持多组Cell实现。

    结合:https://blog.csdn.net/qiuhaozhou/article/details/54582741

    下面是我所要的样式的实现的代码:

    .h文件如下:

    #import <UIKit/UIKit.h> 

    @interface JYECircleFlowLayout : UICollectionViewFlowLayout

    //  一行中 cell 的个数

    @property (nonatomic,assign) NSUInteger itemCountPerRow;

    //    一页显示多少行

    @property (nonatomic,assign) NSUInteger rowCount; 

    /** 列间距 */

    @property (nonatomic, assign) CGFloat columnSpacing;

    /** 行间距 */

    @property (nonatomic, assign) CGFloat rowSpacing;

    /** collectionView的内边距 */

    @property (nonatomic, assign) UIEdgeInsets edgeInsets;

    /** 设置行列间距及collectionView的内边距 */

    - (void)setColumnSpacing:(CGFloat)columnSpacing rowSpacing:(CGFloat)rowSpacing edgeInsets:(UIEdgeInsets)edgeInsets;

    @end

    .m文件

    #import "JYECircleFlowLayout.h"

    @interface JYECircleFlowLayout () <UICollectionViewDelegateFlowLayout>

    @property (strong, nonatomic) NSMutableArray *allAttributes;

    @end

    @implementation JYECircleFlowLayout

    #pragma mark - Public

    - (void)setColumnSpacing:(CGFloat)columnSpacing rowSpacing:(CGFloat)rowSpacing edgeInsets:(UIEdgeInsets)edgeInsets

    {

        self.columnSpacing = columnSpacing;

        self.rowSpacing = rowSpacing;

        self.edgeInsets = edgeInsets;

    }

    #pragma mark - 重写父类方法

    - (instancetype)init

    {

        self = [super init];

        if (self) {

        }

        return self;

    }

    - (void)prepareLayout

    {

        [super prepareLayout];

        self.allAttributes = [NSMutableArray array];

        NSInteger sections = [self.collectionView numberOfSections];

        for (int i = 0; i < sections; i++)

            

        {

            NSMutableArray * tmpArray = [NSMutableArray array];

            NSUInteger count = [self.collectionView numberOfItemsInSection:i];

            for (NSUInteger j = 0; j<count; j++) {

                

                NSIndexPath *indexPath = [NSIndexPath indexPathForItem:j inSection:i];

                

                UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForItemAtIndexPath:indexPath];

                

                [tmpArray addObject:attributes];

                

            }

            [self.allAttributes addObject:tmpArray];

        }

    }

    /** 计算collectionView的滚动范围 */

    - (CGSize)collectionViewContentSize

    {

        NSInteger sections = [self.collectionView numberOfSections];

        return CGSizeMake(JYEScreenWidth*sections, 0);

    }

    - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath

    {

        NSUInteger item = indexPath.item;

        NSUInteger x;

        NSUInteger y;

        [self targetPositionWithItem:item resultX:&x resultY:&y];

        NSUInteger item2 = [self originItemAtX:x y:y];

        NSIndexPath *theNewIndexPath = [NSIndexPath indexPathForItem:item2 inSection:indexPath.section];

        UICollectionViewLayoutAttributes *theNewAttr = [super layoutAttributesForItemAtIndexPath:theNewIndexPath];

        theNewAttr.indexPath = indexPath;

        return theNewAttr;

    }

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

        NSArray *attributes = [super layoutAttributesForElementsInRect:rect];

        NSMutableArray *tmp = [NSMutableArray array];

        for (UICollectionViewLayoutAttributes *attr in attributes) {

            for (NSMutableArray *attributes in self.allAttributes)

            {

                for (UICollectionViewLayoutAttributes *attr2 in attributes) {

                    if (attr.indexPath.item == attr2.indexPath.item) {

                        [tmp addObject:attr2];

                        break;

                    }

                }

            }

        }

        return tmp;

    }

    - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{

        return YES;

    }

    // 根据 item 计算目标item的位置

    // x 横向偏移  y 竖向偏移

    - (void)targetPositionWithItem:(NSUInteger)item resultX:(NSUInteger *)x resultY:(NSUInteger *)y{

        NSUInteger page = item/(self.itemCountPerRow*self.rowCount);

        NSUInteger theX = item % self.itemCountPerRow + page * self.itemCountPerRow;

        NSUInteger theY = item / self.itemCountPerRow - page * self.rowCount;

        if (x != NULL) {

            *x = theX;

        }

        if (y != NULL) {

            *y = theY;

        }

    }

    // 根据偏移量计算item

    - (NSUInteger)originItemAtX:(NSUInteger)x y:(NSUInteger)y{

        NSUInteger item = x * self.rowCount + y;

        return item;

    }

    @end

  • 相关阅读:
    (转载)Android content provider基础与使用
    如何解决Android的SDK与ADT不匹配问题
    Android 中断线程的处理
    用AsyncTask 来实现下载图片在android开发中
    开源自己的一个小android项目(美女撕衣服游戏)
    实现在Android开发中的Splash Screen开场屏的效果
    支持在安卓中UI(View)的刷新功能
    android从资源文件中读取文件流显示
    后缀数组 模板题 hdu1403(最长公共(连续)子串)
    Codeforces Round #383 (Div. 1) C(二分图)
  • 原文地址:https://www.cnblogs.com/lrr0618/p/9517297.html
Copyright © 2011-2022 走看看