美文网首页UITableView和UICollectionView
UICollectionView + UIPageControl

UICollectionView + UIPageControl

作者: 失忆的程序员 | 来源:发表于2022-12-15 16:13 被阅读0次

样式

样式
你的VC 中哈 我放在view里了,你直接放在你的 VC里就好。
// 轮播item

#import "BaseBannerItemView.h"
#import "BaseBannerItemFlowLayout.h"
#import "BaseBannerItemCell.h"

#define kScreenHeight [[UIScreen mainScreen] bounds].size.height
#define kScreenWidth  [[UIScreen mainScreen] bounds].size.width

@interface BaseBannerItemView ()
<
UICollectionViewDelegate, UICollectionViewDataSource
>

@property (nonatomic, strong) UICollectionView *collectionView; ///< 日历视图
@property (nonatomic, strong) NSMutableArray *dateArray; ///< 数据源数组
@property (nonatomic, strong) UIPageControl *pageControl; ///<

@end

@implementation BaseBannerItemView

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self addContUI];
    }
    return self;
}

// MARK: ----- UI
- (void)addContUI
{
    self.dateArray = [@[@1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13] mutableCopy];
    NSInteger indexCount = 1;
    if (self.dateArray.count % (10) != 0)
    {
        indexCount = self.dateArray.count / (10) + 1;
    }
    else
    {
        indexCount = self.dateArray.count / (10);
    }
    self.pageControl.numberOfPages = indexCount;
    
    //
    [self addSubview:self.pageControl];
    [self.pageControl mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.bottom.mas_equalTo(0);
        make.height.mas_equalTo(RATIOA(15));
    }];
    //
    [self addSubview:self.collectionView];
    [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.top.right.mas_equalTo(0);
        make.bottom.mas_equalTo(self.pageControl.mas_top);
    }];
    
}


- (void)pageControlValueChange:(UIPageControl *)pageControl
{
    NSLog(@"%ld", pageControl.currentPage);  // 根据当前页的不同的值, 可以实现不同的功能
    self.collectionView.contentOffset = CGPointMake(self.collectionView.frame.size.width * pageControl.currentPage, 0);
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    CGFloat pageWidth = self.collectionView.frame.size.width;
    self.pageControl.currentPage = self.collectionView.contentOffset.x / pageWidth;
}

// MARK: ----- 数据源方法
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
//    if (section == 0) {
//        return 9;
//    }
//    else if (section == 1) {
//        return 17;
//    }
//    else if (section == 2) {
//        return 25;
//    }
    return self.dateArray.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
//    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
//    cell.backgroundColor = [UIColor redColor];
//    UILabel *label = [[UILabel alloc] initWithFrame:cell.bounds];
//    label.backgroundColor = [UIColor redColor];
//    label.textAlignment = NSTextAlignmentCenter;
//    label.font = [UIFont systemFontOfSize:15];
//    label.text = [NSString stringWithFormat:@"%ld", indexPath.row];
//    label.textColor = [UIColor blueColor];
//    label.numberOfLines = 0;
//    [cell.contentView addSubview:label];
//    return cell;
    
    BaseBannerItemCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"itemCell" forIndexPath:indexPath];
    return cell;
}

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"section %ld  row --- %ld", indexPath.section, indexPath.row);
}




// MARK: ----- lazy

// 日历视图
- (UICollectionView *)collectionView
{
    if (!_collectionView) {
        // 横向滚动
        BaseBannerItemFlowLayout *layout = [[BaseBannerItemFlowLayout alloc] init];
        layout.itemSize = CGSizeMake(kScreenWidth/5, RATIOA(150/2));
        //_collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, kScreenWidth) collectionViewLayout:horizontalLayout];
        _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
        _collectionView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
        _collectionView.pagingEnabled = YES;
        _collectionView.dataSource = self;
        _collectionView.delegate = self;
        _collectionView.showsVerticalScrollIndicator = NO;
        _collectionView.showsHorizontalScrollIndicator = NO;
        _collectionView.bounces = NO;
        _collectionView.pagingEnabled = YES;
        _collectionView.backgroundColor = [UIColor blueColor];
        
        //[_collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
        [_collectionView registerClass:[BaseBannerItemCell class] forCellWithReuseIdentifier:@"itemCell"];
    }
    return _collectionView;
}
// 数据源数组
- (NSMutableArray *)dateArray
{
    if (!_dateArray) {
        _dateArray = [NSMutableArray array];
    }
    return _dateArray;
}

- (UIPageControl *)pageControl
{
    if (!_pageControl) {
        _pageControl = [[UIPageControl alloc] init];
        _pageControl.backgroundColor = [UIColor orangeColor];
        // 设置总页数
        //_pageControl.numberOfPages = indexCount;
        _pageControl.pageIndicatorTintColor = [UIColor cyanColor];
        // 设置当前所在页数
        _pageControl.currentPage = 0;
        _pageControl.currentPageIndicatorTintColor = [UIColor redColor];
        [_pageControl addTarget:self action:@selector(pageControlValueChange:) forControlEvents:UIControlEventValueChanged];
        // 单页时隐藏
        //_pageControl.hidesForSinglePage = YES;
    }
    return _pageControl;
}







@end

这里请注意 每页份额
self.dateArray = [@[@1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13] mutableCopy];
    NSInteger indexCount = 1;
    if (self.dateArray.count % (10) != 0)
    {
        indexCount = self.dateArray.count / (10) + 1;
    }
    else
    {
        indexCount = self.dateArray.count / (10);
    }
    self.pageControl.numberOfPages = indexCount;

自定义 重要

// 

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface BaseBannerItemFlowLayout : UICollectionViewFlowLayout

@end

NS_ASSUME_NONNULL_END

// 

#import "BaseBannerItemFlowLayout.h"

@interface BaseBannerItemFlowLayout ()

@property (nonatomic, copy) NSMutableDictionary *sectionDic;
@property (nonatomic, strong) NSMutableArray *allAttributes;

@end

@implementation BaseBannerItemFlowLayout

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
    }
    return self;
}

- (void)prepareLayout
{
    [super prepareLayout];
    _sectionDic = [NSMutableDictionary dictionary];
    self.allAttributes = [NSMutableArray array];
    //获取section的数量
    NSUInteger section = [self.collectionView numberOfSections];
    for (int sec = 0; sec < section; sec++)
    {
        //获取每个section的cell个数
        NSUInteger count = [self.collectionView numberOfItemsInSection:sec];
        for (NSUInteger item = 0; item<count; item++)
        {
            NSIndexPath *indexPath = [NSIndexPath indexPathForItem:item inSection:sec];
            //重新排列
            UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForItemAtIndexPath:indexPath];
            [self.allAttributes addObject:attributes];
        }
    }
}

- (CGSize)collectionViewContentSize
{
    //每个section的页码的总数
    NSInteger actualLo = 0;
    for (NSString *key in [_sectionDic allKeys])
    {
        actualLo += [_sectionDic[key] integerValue];
    }
    return CGSizeMake(actualLo*self.collectionView.frame.size.width, self.collectionView.contentSize.height);
}

- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)attributes
{
    if (attributes.representedElementKind != nil)
    {
        return;
    }
    /*修改by lixinkai 2017.6.30
     下面这两个方法 itemW、itemH
     解决了同一个UICollectionView使用不同UICollectionViewCell的问题
     */
    // attributes 的宽度
    CGFloat itemW = attributes.frame.size.width;
    // attributes 的高度
    CGFloat itemH = attributes.frame.size.height;
    // collectionView 的宽度
    CGFloat width = self.collectionView.frame.size.width;
    // collectionView 的高度
    CGFloat height = self.collectionView.frame.size.height;
    // 每个attributes的下标值 从0开始
    NSInteger itemIndex = attributes.indexPath.item;
    CGFloat stride = (self.scrollDirection == UICollectionViewScrollDirectionHorizontal) ? width : height;
    // 获取现在的attributes是第几组
    NSInteger section = attributes.indexPath.section;
    // 获取每个section的item的个数
    NSInteger itemCount = [self.collectionView numberOfItemsInSection:section];
    CGFloat offset = section * stride;
    // 计算x方向item个数
    NSInteger xCount = (width / itemW);
    // 计算y方向item个数
    NSInteger yCount = (height / itemH);
    // 计算一页总个数
    NSInteger allCount = (xCount * yCount);
    // 获取每个section的页数,从0开始
    NSInteger page = itemIndex / allCount;
    // 余数,用来计算item的x的偏移量
    NSInteger remain = (itemIndex % xCount);
    // 取商,用来计算item的y的偏移量
    NSInteger merchant = (itemIndex-page*allCount)/xCount;
    // x方向每个item的偏移量
    CGFloat xCellOffset = remain * itemW;
    // y方向每个item的偏移量
    CGFloat yCellOffset = merchant * itemH;
    // 获取每个section中item占了几页
    NSInteger pageRe = (itemCount % allCount == 0)? (itemCount / allCount) : (itemCount / allCount) + 1;
    // 将每个section与pageRe对应,计算下面的位置
    [_sectionDic setValue:@(pageRe) forKey:[NSString stringWithFormat:@"%ld", section]];
    if (self.scrollDirection == UICollectionViewScrollDirectionHorizontal)
    {
        NSInteger actualLo = 0;
        // 将每个section中的页数相加
        for (NSString *key in [_sectionDic allKeys])
        {
            actualLo += [_sectionDic[key] integerValue];
        }
        // 获取到的最后的数减去最后一组的页码数
        actualLo -= [_sectionDic[[NSString stringWithFormat:@"%ld", [_sectionDic allKeys].count-1]] integerValue];
        xCellOffset += page*width + actualLo*width;
    }
    else
    {
        yCellOffset += offset;
    }
    attributes.frame = CGRectMake(xCellOffset, yCellOffset, itemW, itemH);
}

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
    //UICollectionViewLayoutAttributes *attr = [UICollectionViewLayoutAttributes  layoutAttributesForCellWithIndexPath:indexPath];
    UICollectionViewLayoutAttributes *attr = [super layoutAttributesForItemAtIndexPath:indexPath].copy;
    [self applyLayoutAttributes:attr];
    return attr;
}

- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{
    return self.allAttributes;
}

@end


相关文章

网友评论

    本文标题:UICollectionView + UIPageControl

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