以前瀑布流的时候使用过uicollectionview,但是那时使用的是系统自带的uicollectionviewflowlayout布局,今天看文章,看到uicollectionviewflowlayout自定义相关的东西,于是动手写了一个简单图片浏览的demo,熟练一些uicollectionviewflowlayout自定义布局。
1
2
3
4
5
|
#import <uikit/uikit.h>
@interface jwcollectionviewflowlayout : uicollectionviewflowlayout
@end
|
自定义uicollectionviewflowlayout,首先继承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
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
#define screenwidth [uiscreen mainscreen].bounds.size.width
#define maxchangerange 100
#import "jwcollectionviewflowlayout.h"
@implementation jwcollectionviewflowlayout
-( void )preparelayout
{
self.scrolldirection = uicollectionviewscrolldirectionhorizontal;
self.itemsize = cgsizemake(300, 500);
}
- ( bool )shouldinvalidatelayoutforboundschange:(cgrect)newbounds
{
return yes;
}
- (nullable nsarray<__kindof uicollectionviewlayoutattributes *> *)layoutattributesforelementsinrect:(cgrect)rect
{
nsarray *array = [super layoutattributesforelementsinrect:rect];
cgrect visiblerect = cgrectmake(self.collectionview.contentoffset.x, 0, self.collectionview.bounds.size.width, self.collectionview.bounds.size.height);
for (uicollectionviewlayoutattributes *attr in array)
{
if (cgrectintersectsrect(attr.frame, rect)) {
bool isatright = yes;
cgfloat distance = (attr.center.x - cgrectgetmidx(visiblerect));
if (distance<0) {
distance = -distance;
isatright = no;
}
cgfloat precent ;
if (distance < 180)
{
precent = 1.0;
}
else
{
precent = ((screenwidth / 2) - distance) / (screenwidth / 2);
}
catransform3d transform = catransform3didentity;
transform.m34 = 1.0 / 600;
if (precent < 0.5) {
precent = 0.5;
}
transform = catransform3dscale(transform, 1, precent, 1);
cgfloat p = isatright?m_pi_4:-m_pi_4;
transform = catransform3drotate(transform, p * (1 - precent), 0, 1, 0);
attr.transform3d = transform;
attr.zindex = 1;
attr.alpha = precent;
}
}
return array;
}
- (cgpoint)targetcontentoffsetforproposedcontentoffset:(cgpoint)proposedcontentoffset withscrollingvelocity:(cgpoint)velocity
{
cgfloat offset = maxfloat;
cgfloat hcenter = proposedcontentoffset.x + (cgrectgetwidth(self.collectionview.bounds) / 2.0);
cgrect currentrect = cgrectmake(proposedcontentoffset.x, 0, self.collectionview.bounds.size.width, self.collectionview.bounds.size.height);
nsarray* array = [super layoutattributesforelementsinrect:currentrect];
for (uicollectionviewlayoutattributes* layoutattributes in array)
{
cgfloat itemhorizontalcenter = layoutattributes.center.x;
if ( abs (itemhorizontalcenter - hcenter) < abs (offset))
{
offset = itemhorizontalcenter - hcenter;
}
}
return cgpointmake(proposedcontentoffset.x + offset, proposedcontentoffset.y);
}
|
使用
1
2
3
4
5
6
7
8
9
10
11
12
13
|
-( void )setupui
{
jwcollectionviewflowlayout *flowlayout = [[jwcollectionviewflowlayout alloc] init];
uicollectionview *imgbrowseview = [[uicollectionview alloc] initwithframe:self.view.bounds collectionviewlayout:flowlayout];
imgbrowseview.datasource = self;
imgbrowseview.delegate = self;
imgbrowseview.backgroundcolor = [uicolor whitecolor];
[self.view addsubview:imgbrowseview];
_imgbrowseview = imgbrowseview;
[self.imgbrowseview registernib:[uinib nibwithnibname:@ "custumcollectionviewcell" bundle:nil] forcellwithreuseidentifier:@ "cell" ];
}
|
demo:https://github.com/jiangtaidi/jwimagebrowsedemo.git
运行结果:
以上就是本文的全部内容,希望对大家的学习有所帮助。