自定义UICollectionViewCell 以及碰到的问题

2017-10-29  本文已影响0人  幸运密码_xymm16888

自定义UICollectionViewCell 以及碰到的问题
原创 2016年09月12日 16:37:50 标签:UICollectionView /自定义UIControllViewCel /ios 10024
前言:

今天没事自己写了个UICollectionView也就是九宫格的demo ,遇到几个小问题,虽然都很快解决了,但是这里还是把它记录下来,以后方便查阅。
(UICollectionView 一下用九宫格代称)废话不多说了,直接开始。微笑
创建一个UICollectionView

首先,创建一个UICollectionView ,需要设置的几个代理 UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout。九宫格 跟UITableView类似,这里只是实现最简单的代理方法。
[objc] view plain copy

其中_collectionView 是我创建的九宫格,CollectionViewCell 是我创建的自定义Cell,这个下面再讲。
上面我就碰到了了一个小问题,其实也是我自己不细心的原因,但是也是容易出错的地方:
[objc] view plain copy
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];

_collectionView = [[UICollectionView alloc]initWithFrame:self.view.frame collectionViewLayout:flowLayout];
上面的UICollectionViewFlowLayout ,这个类是九宫格用来实现自动布局的,注意千万不要写错,我就因为写错,写成了
UICollectionViewLayout (这个类我是直接点击去九宫格的初始化方法里面看到的)导致了九宫格显示不出来,其他地方也没有错,
调了好几遍,最后终于发现是这个类写错了,UICollectionViewFlowLayout 是UICollectionViewLayout 的子类。
好了,一个问题过去了。
准备UICollectionView 的数据

在实现九宫格的代理方法之前,先展示一下 需要的数据
[objc] view plain copy
@property (nonatomic, copy) NSMutableArray *dataSourceArray;
//宏是完全替换

define CellWidthSpace 20

define CellWidth (kScreenWidth - (5 * CellWidthSpace))/4

define CellLineSpace 10

self.dataSourceArray = [NSMutableArray arrayWithArray:@[@"image1.png",@"image2.png",@"image3.png",<span style="font-family: Arial, Helvetica, sans-serif;">@"image4.png",@"image5.png",@"image4.png",@"image3.png",@"image2.png",@"image1.png"]];</span>
dataSourceArray 是九宫格的数据,CellWidthSpace 是每行Cell之间的间距,CellLineSpace 是每列Cell之间的间距,这个
都是自己定义的。 kScreenWidth 是整个屏幕的宽度,重点是CellWidth, 我要显示4列的九宫格,间距需要5个,所以就是 屏宽度
减去5个空隙 后再除以4.就得到了每个Cell的 的宽度。
实现UICollectionView的代理

[objc] view plain copy

pragma mark UICollectionViewDelegateFlowLayout

//设置每个Cell 的宽高

pragma mark UICollectionViewDataSource

//设置九宫格Cell 的个数

pragma mark UICollectionViewDelegate

//设置点击 Cell的点击事件

pragma mark UIAlertView

重点是设置Cell的方法,我是使用了自定义Cell,这里就会显示出UICollectionView 与 UITableview 的不同.
首先,UICollectionView 与UITableView 都有类似的
[objc] view plain copy
[collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
这个是 Cell 的重用机制。UITableView 需要判断Cell是否 为空
[objc] view plain copy
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
如果cell =nil 里面就可以使用 自定义 UITableViewCell 这里不再说了,但是UICollectionView 不需要判断Cell 是否为nil,可以使用系统
的UICollectionViewCell 也可以使用自定义的UICollectionViewCell,我们一般用的就是自定义的Cell .
[objc] view plain copy

import <UIKit/UIKit.h>

@interface CollectionViewCell : UICollectionViewCell

@property (nonatomic, copy) NSString *imageName;

@end

.m 文件

import "CollectionViewCell.h"

@interface CollectionViewCell ()
@property (nonatomic, strong) UIImageView *imageView;

@end

@implementation CollectionViewCell

@end

这里返回cell 的方法好像只能写
[objc] view plain copy

这里我又连续碰到了2个问题,当然我上面粘贴出来出来的都是正确的。先说说第一个问题,我是在
[objc] view plain copy

问题的原因是,我设置UIImageView 的位置是 self.frame 这个位置是相对于整个UICollectionView 的,再添加自定义Cell 上面的时候,就不对了,那个位置是cell相对于父视图 UICollectionView的,添加到Cell 上面的,UIImageView 的父视图是Cell 而不是UICollectionView,所以设置图片视图UIImageView 的位置的时候应该用相对于Cell 位置的self.bounds .

以上,就是我在实现UICollectionView 的时候碰到的小问题,以及自定义UICollectionViewCell 。啦啦啦啦得意

上一篇下一篇

猜你喜欢

热点阅读