CollectionView网格布局

说句老实话,UICollectionView真的太强大了,而且要掌握高级部分是相当困难的。至少笔者是这么认为的,如果觉得自己比较厉害,可以轻而易举地掌握UICollectionView的使用的,希望可以总结点经验!

本篇文章是在练习如何使用UICollectionView进行网格布局。网格布局是非常常见的UI布局,在很多的App中都这么设计过。本篇文章只讲如何实现风格布局,demo中有一些是优化方面的,会单独写一篇文章讲解如何优化网格布局中的图片。

实现效果

FlowLayout

本demo中需要使用到UICollectionViewFlowLayout,因此先讲讲这个类:

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

// iOS6.0以后才有的

NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionViewFlowLayout : UICollectionViewLayout

// 行之间的最小间距

@property (nonatomic) CGFloat minimumLineSpacing;

// item之间的最小间距

@property (nonatomic) CGFloat minimumInteritemSpacing;

// 如果cell的大小是固定的,应该直接设置此属性,就不用实现代理

@property (nonatomic) CGSize itemSize;

// 这是8.0后才能使用,评估item的大小

@property (nonatomic) CGSize estimatedItemSize NS_AVAILABLE_IOS(8_0);

// 支持两种滚动方向,水平滚动和竖直功能

// 因此不要再想要使用横向tableview,直接使用collectionview就okb

@property (nonatomic) UICollectionViewScrollDirection scrollDirection;

// header参考大小

@property (nonatomic) CGSize headerReferenceSize;

// footer参考大小

@property (nonatomic) CGSize footerReferenceSize;

// section的inset,用于设置与上、左、底、右的间隔

@property (nonatomic) UIEdgeInsets sectionInset;

// 9.0以后才有的属性,用于设置header/footer与tableview的section效果一样。

// 可以悬停

@property (nonatomic) BOOL sectionHeadersPinToVisibleBounds NS_AVAILABLE_IOS(9_0);

@property (nonatomic) BOOL sectionFootersPinToVisibleBounds NS_AVAILABLE_IOS(9_0);

@end

这个类是用于决定UICollectionView的item的布局的。

创建CollectionView

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

// 创建UI布局

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];

// 设置成固定的大小

layout.itemSize = CGSizeMake((kScreenWidth - 30) / 2, (kScreenWidth - 30) / 2 + 20);

// 行间距最小设置为10

layout.minimumLineSpacing = 10;

// 列间距最小设置为10

layout.minimumInteritemSpacing = 10;

self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds

collectionViewLayout:layout];

[self.view addSubview:self.collectionView];

// 注册cell

[self.collectionView registerClass:[HYBGridCell class]

forCellWithReuseIdentifier:cellIdentifier];

// 设置代理

self.collectionView.delegate = self;

self.collectionView.backgroundColor = [UIColor blackColor];

// 设置数据源代理

self.collectionView.dataSource = self;

实现代理

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#pragma mark - UICollectionViewDataSource & UICollectionViewDelegate

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView

cellForItemAtIndexPath:(NSIndexPath *)indexPath {

HYBGridCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier

forIndexPath:indexPath];

HYBGridModel *model = self.datasource[indexPath.item];

[cell configCellWithModel:model];

return cell;

}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {

return self.datasource.count;

}

创建一个对应的cell,这里呢实现只是简单的添加两个控件而已:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

- (instancetype)initWithFrame:(CGRect)frame {

if (self = [super initWithFrame:frame]) {

self.imageView = [[UIView alloc] init];

self.imageView.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.width);

[self.contentView addSubview:self.imageView];

self.titleLabel = [[UILabel alloc] init];

self.titleLabel.frame = CGRectMake(0, self.frame.size.height - 20, self.frame.size.width, 20);

self.titleLabel.numberOfLines = 0;

self.titleLabel.font = [UIFont systemFontOfSize:16];

self.titleLabel.textColor = [UIColor whiteColor];

self.titleLabel.backgroundColor = [UIColor blackColor];

self.titleLabel.layer.masksToBounds = YES;

[self.contentView addSubview:self.titleLabel];

}

return self;

}

时间: 2024-10-11 01:37:15

CollectionView网格布局的相关文章

CSS3 网格布局(grid-layout)基础知识 - 网格模板属性(grid-template)使用说明

CSS3引入了新的网格布局(grid layout),以适应显示和设计技术的发展(尤其是移动设备优先的响应式设计). 主要目标是建立一个稳定可预料且语义正确的网页布局模式,用来替代过往表现不稳定且繁琐的table.flow以及JS脚本混合技术来实现的网页动态布局. 本文将简单而准确的介绍网格布局属性的基本概念和使用方法(摘自踏得网在线HTML5教程). 1. 概述 网格模板区域(grid-template-areas).网格模板行(grid-template-rows)和网格模板列(grid-t

在SOUI中使用网格布局

在实现网格布局前,SOUI支持两种布局形式:相对布局,和线性布局,其中线性布局是2017年2月份才支持的布局. 这两年工作都在Android这里,Android里有号称5大布局(RelativeLayout, LinearLayout, FrameLayout, GridLayout,TableLayout). FrameLayout很简单,在SOUI里一般用TabCtrl就实现了.RelativeLayout和SOUI自己的相对布局功能类似,线性布局也有了,但是一直没有实现GridLayout

CSS多列布局Multi-column、伸缩布局Flexbox、网格布局Grid详解

新css属性为我们提供了更加便捷的网页布局方式.来自微软的thomas lewis将带你认识去Grid Alignment,Flexibox Box以及Multi-column Layout这三大领域. 这篇文章最早出现在the April 2012 issue (226)这期的.net杂志上-这杂志是面向网页设计者以及开发者,全球销量最高的杂志. 按照以往来说,用CSS来布局看起来总是一样非常繁杂的工作.然而,随着一个个新标准的推出,网页设计者已经能够实现非常轻松地进行布局工作了. 主流的浏览

第7章(4) GridLayout(网格布局)

分类:C#.Android.VS2015: 创建日期:2016-02-10 一.简介 Android 4.0(API 14)开始提供的GridLayout布局使用虚细线将布局划分为行.列和单元格,也支持一个控件在行.列上都有交错排列. GridLayout使用与LinearLayout类似的API,只不过是修改了一下相关的标签而已. 1.默认布局方式-先行后列 GridLayout默认按先行后列的方式依次显示,子元素默认按照wrap_content的方式显示.如果不希望子元素显式指定其所在的行列

JAVA 网格布局管理器

//网格布局管理器 import java.awt.*; import javax.swing.*; public class Jiemian3 extends JFrame{ //定义组件 JButton[] an = {null,null,null,null,null,null,null,null}; public static void main(String[] args){ //运行本类的构造方法 Jiemian3 jiemian = new Jiemian3(); } public

android的布局-----GridLayout(网格布局)

学习导图 (一)简介 网格布局由GridLayout所代表,在android4.0之后新增加的布局管理器,因此需要android4.0之后的版本中使用,如果在更早的平台使用该布局管理器,则需要导入相应的支持库<android.support.v7.widget.GridLayout> (二)案列----计算器 <?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android

Java图形化界面设计——布局管理器之GridLayout(网格布局) 之计算器

代码如下: import java.awt.*; import javax.swing.*; public class GridFrame extends JFrame { // 定义字符串数组,为按钮的显示文本赋值 String str[] = { "MC", "MR", "MS", "M+", "←", "C", "%", "π", "

GUI布局:边界布局、流式布局、网格布局、卡片布局

边界布局 package guiTest; //JFrame默认的是边界布局BorderLayout import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFrame; public class BorderLayoutDemo { public static void main(String[] args) { JFrame f = new JFrame("边界布局BorderLayout&q

Android组件式开发(2)——实现网格布局的RadioButton矩阵

** 前言 ** 在Android中,我们一般通过RadioGroup来管理一组RadioButton 来达到 单选按钮的互斥效果.但是,有些需求中,需要完成N行N列这样的RadioButton组成的矩阵,但是我们的RadioGroup是一个耿直的LinearLayout,无法完成网格布局╮(╯▽╰)╭.所以,下面我就像大家来介绍一种实现网格布局的RadioButton的思路. 无图无真相, 先上一下效果图~ ** 思路 ** 提到网格布局,最简单的就是使用系统的GridView来实现,我们需要