• UICollectionView



    前言

    本篇:进行UICollectionView的学习


    提示:以下是本篇文章正文内容,下面案例可供参考

    基础

    概念

    UICollectionView是我们常说的集合视图,是iOS开发者中最受欢迎的UI控件之一。其布局灵活可变,可用于显示有限数据项集,最常见的用途是网格的形式显示item,初次之外还可以通过子类化UICollectionViewLayOut泪,精准的控制可视化元素布局,并动态改变布局,可以实现网格,堆栈,圆形,动态变化,和任何能想象到的布局

    UICollectionView与相关对象关系

    data source用于提供呈现数据的视图对象
    Collection View layout用于提供视图布局信息
    Collection view负责将数据和布局信息整合后呈现到屏幕上

    注意事项

    创建UICollectionView对象时,必须传递一个UICollectionViewLayout对象,而UICollectionViewLayout对象不能直接使用,必须使用其子类,在创建网格布局时一般使用其子类UIConllectionViewFlowLayout的子类

    强大的控件

    UICollectionView是比UItableView更强大的一个控件。

    1. 支持水平和垂直两种方向的布局
    2. 通过layout方式进行布局
    3. 类似tableView中的cell,UICollectionView中的item可以自由定义大小和位置
    4. 可以动态布局每个item的大小和collection的大体布局属性
    5. 完全自定义一套layout的布局方案,

    相关的类

    用途类/协议描述
    集合视图和集合视图控制器UIConllectionView,UIConllectionViewControllerUICollectionView派生于UIScrollerView,定义集合视图内容区域,将layout的布局信息和dateSource的数据整合后呈现到屏幕上
    内容控制UICollectionViewDataSource协议,UICollectionViewDelegate协议dataSource为集合视图提供数据,是UICollectionView中最重要、必须提供的对象。要实现dataSource中的方法,必须创建一个遵守UICollectionViewDataSource协议的对象。通过UICollectionView的delegate对象可以监听集合视图状态、自定义视图。例如,使用delegate跟踪item是否高亮、选中。与数据源对象不同,代理对象不是必须实现
    呈现视图UICollectionReusableView ,UICollectionViewCellUICollectionView中的所有视图都必须是UICollectionReusableView类的实例。该类支持回收机制,特别是在华东屏幕时。UICollectionViewCell用来显示主要数据
    布局UICollectionViewLayout,UICollectionViewLayoutAttributes,UICollectionViewUpdateItemUICollectionViewLayout的子类为集合视图内元素提供位置,带下,视觉属性等布局信息。在布局构成中,layout对象创建UICollectionViewLayoutAttributes实例,告诉item如何布局 。当collectionView的数据源发生插入,删除,移动等变化时,UICollectionView会创建UICollectionViewUpdateItem类的实例,并发送给layout的prepareForCollectionViewUpdates:方法,layout会为即将到来的布局变化作准备
    FlowlayoutUICollectionViewFlowLayout,UICollectionViewDelegateFlowLayout协议UIC哦来了抽屉哦那Vi额外FlowLayout类时用于实现网格或其他基于行布局的具体类,可以直接用,也可以将其于UICollectionViewDelegateFlowLayout代理结合使用,

    UiCollectionViewLayout,UICollectionViewReusableView类必须子类化才可以使用,其他类可以直接使用

    重新使用视图提高性能

    UICollectionView使用了视图回收机制以提高性能,当视图被滑出屏幕时,不回删除视图,而是置于重用队列中。当UiCollectionView显示新的内容时,将从重用队列中获取视图。为便于回收和重用,UiCollectionView显示的所有视图必须派生UICollectionReusableView

    • 集合视图单元格UICollectionViewCell:显示集合视图的主要内容,cell必须是UICollectionViewCell类的实例,默认支持管理高粱hightlight,选中selection状态
    • 补充视图SupplementaryView:section的信息。和cell一样supplementaryView也是数据驱动的,但与cell不同的是layout控制supplementaryView的位置和是否使用。流式布局UICollectionViewFlowLayout可以选择性添加页眉sectionheader和页脚sectionfooter补充视图
    • 装饰视图DecorationView:由layout完全拥有的装饰视图,且不受数据眼约束。

    UICollectionView的数据源对象负责提供cell和supplementaryView,但dataSource从来不会直接创建cell,supplementaryView。当需要展示视图时,如果队列存在所需类型的视图,则会直接出列所需视图,如果队列没有所需视图,则会利用提供的nib文件,storyboard或代码创建。

    例子

    在这里插入图片描述

    //  ViewController.h
    //  CollectionView
    //
    //
    
    #import 
    
    @interface ViewController : UIViewController
    
    <UICollectionViewDelegate,
    UICollectionViewDataSource>
    
    @property (strong, nonatomic) UICollectionView* collectionView;
    @property (strong, nonatomic) UICollectionViewFlowLayout* flowLayout;
    
    @end
    
    
    
    
    //  ViewController.m
    //  CollectionView
    //
    //
    
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.flowLayout = [[UICollectionViewFlowLayout alloc] init];
        self.flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;
        self.flowLayout.itemSize = CGSizeMake(self.view.frame.size.width/5 - 20, self.view.frame.size.height / 5 - 20);
        self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) collectionViewLayout:self.flowLayout];
        self.collectionView.delegate = self;
        self.collectionView.dataSource = self;
        [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"111"];
        [self.view addSubview:self.collectionView];
        
        
        // Do any additional setup after loading the view.
    }
    - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
        return 1;
    }
    - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
        return 10;
    }
    - (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath:(nonnull NSIndexPath *)indexPath{
        UICollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"111" forIndexPath:indexPath];
        cell.backgroundColor = [UIColor grayColor];
        UILabel* lab = [[UILabel alloc] init];
        lab.frame = CGRectMake(10, 10, 30, 30);
        lab.text = @"1111";
        [cell.contentView addSubview:lab];
        return cell;
    }
    @end
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    一些方法

    //设置item间距大小
    - (CGFloat)collectionView:(UICollectionView*)collectionView layout:(nonnull UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{
        return 20;
    }
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    【计算机毕业设计】75.教师工作考核绩效管理系统源码
    Appium入门自动化测试(3) —— Appium 常用API
    阿里云/腾讯云国际站代理:腾讯云国际站开户购买EdgeOne发布,安全加速一体化方案获业内认可
    Linux通过QQ邮箱账号使用mailx发送邮件
    mybatis_plus
    ANSVC无功补偿装置助力江苏某环保能源项目
    完美免费在线去背景图片,便捷变速。在5秒内消除或者替换图像背景,智能调整颜色,所有操作都在浏览器完成,无需上传图像 - BgSub
    一次实战压测流程及问题梳理
    MySQL数据库(基础)——期末复习总结
    docker(第四天)
  • 原文地址:https://blog.csdn.net/weixin_61196797/article/details/128076351