本文实例为大家分享了ios实现列表下拉放大效果展示的具体代码,供大家参考,具体内容如下
先看效果图
突然发现没有做出来之前都觉得蛮难的,做出来之后就觉得so easy 大家都有这样的感触吧
做这个就重写 uicollectionviewflowlayout 的几个方法就可以
oc版本
创建一个类 customcollectionviewflowlayout 继承 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
|
//
// customcollectionviewflowlayout.m
//
//
// created by gonghui_yj on 16/8/4.
// copyright © 2016年 yangjian. all rights reserved.
//
#import "customcollectionviewflowlayout.h"
@implementation customcollectionviewflowlayout
- ( bool )shouldinvalidatelayoutforboundschange:(cgrect)newbounds
{
return yes;
}
- (nsarray *)layoutattributesforelementsinrect:(cgrect)rect {
uicollectionview *collectionview = [self collectionview];
uiedgeinsets insets = [collectionview contentinset];
cgpoint offset = [collectionview contentoffset];
cgfloat miny = -insets.top;
nsarray *attributes = [super layoutattributesforelementsinrect:rect];
if (offset.y < miny) {
cgsize headersize = [self headerreferencesize];
cgfloat deltay = fabsf(offset.y - miny);
for (uicollectionviewlayoutattributes *attrs in attributes) {
if ([attrs representedelementkind] == uicollectionelementkindsectionheader) {
cgrect headerrect = [attrs frame];
headerrect.size.height = max(miny, headersize.height + deltay);
headerrect.origin.y = headerrect.origin.y - deltay;
[attrs setframe:headerrect];
break ;
}
}
}
return attributes;
}
@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
|
// 创建collectionview
customcollectionviewflowlayout *flowlayout=[[customcollectionviewflowlayout alloc] init];
[flowlayout setsectioninset:uiedgeinsetsmake(0, 0, 10, 0)];
[flowlayout setitemsize:cgsizemake(kscreenwidth / collectioncellw, kscreenwidth / collectioncellw)];
[flowlayout setheaderreferencesize:cgsizemake(kscreenwidth, userinfoimageviewh)];
[flowlayout setfooterreferencesize:cgsizemake(kscreenwidth, 83)];
[flowlayout setscrolldirection:uicollectionviewscrolldirectionvertical];
[flowlayout setminimuminteritemspacing:0.0];
[flowlayout setminimumlinespacing:0.0];
self.homecollectionview = [[uicollectionview alloc]initwithframe:cgrectmake(0, 0, kscreenwidth, kscreenheight - 44)collectionviewlayout:flowlayout];
self.homecollectionview.backgroundcolor = kviewbackgroundcolor;
self.homecollectionview.alwaysbouncevertical = yes;
self.homecollectionview.showsverticalscrollindicator = no;
//设置代理
self.homecollectionview.delegate = self;
self.homecollectionview.datasource = self;
[self.view addsubview:self.homecollectionview];
// 注册表头
[self.homecollectionview registerclass:[yjheadercollectionreusableview class ] forsupplementaryviewofkind:uicollectionelementkindsectionheader withreuseidentifier:kcollectionheaderview];
// 注册表尾
[self.homecollectionview registerclass:[uicollectionreusableview class ] forsupplementaryviewofkind:uicollectionelementkindsectionfooter withreuseidentifier:kcollectionfooterview];
|
swift版
喜欢swift 不需要导入头文件那么麻烦
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
|
//
// customcollectionviewflowlayout.swift
//
//
// created by gonghui_yj on 16/8/4.
// copyright © 2016年yangjian. all rights reserved.
//
import uikit
class customcollectionviewflowlayout: uicollectionviewflowlayout {
override func shouldinvalidatelayoutforboundschange(newbounds: cgrect) -> bool {
return true
}
override func layoutattributesforelementsinrect(rect: cgrect) -> [uicollectionviewlayoutattributes]? {
let collectionview = self.collectionview
let insets = collectionview?.contentinset
let offset = collectionview?.contentoffset
let miny = -((insets?.top)!)
let attributesarray = super.layoutattributesforelementsinrect(rect)
if offset!.y < miny {
let headersize = self.headerreferencesize
let deltay = cgfloat(fabsf( float ((offset?.y)! - cgfloat(miny))))
for attrs:uicollectionviewlayoutattributes in attributesarray! {
if attrs.representedelementkind == uicollectionelementkindsectionheader {
var headerrect = attrs.frame
headerrect.size.height = max(miny, headersize.height + deltay)
headerrect.origin.y = headerrect.origin.y - deltay
attrs.frame = headerrect
break
}
}
}
return attributesarray
}
}
|
在控制器 viewdidload方法实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
let customflowlayout = customcollectionviewflowlayout()
customflowlayout.headerreferencesize = cgsizemake(kscreenwidth, 203)
customflowlayout.footerreferencesize = cgsizemake(kscreenwidth, 83)
customflowlayout.minimuminteritemspacing = 0
customflowlayout.minimumlinespacing = 0
customflowlayout.itemsize = cgsizemake(kscreenwidth / 3.000006, kscreenwidth / 3.00006)
customflowlayout.sectioninset = uiedgeinsetsmake(0, 0, 10, 0)
self.homecollectionview.setcollectionviewlayout(customflowlayout, animated: true )
self.homecollectionview.backgroundcolor = kviewbackgroundcolor
self.homecollectionview.alwaysbouncevertical = true
let nib = uinib(nibname: "commoncollectionviewcell" , bundle: nil)
self.homecollectionview.registernib(nib, forcellwithreuseidentifier: cellid)
// 注册表头表尾
let headernib = uinib(nibname: "headercollectionreusableview" , bundle: nil)
self.homecollectionview.registernib(headernib, forsupplementaryviewofkind: uicollectionelementkindsectionheader, withreuseidentifier: collectionheaderid)
self.homecollectionview.registerclass(uicollectionreusableview.classforcoder(), forsupplementaryviewofkind: uicollectionelementkindsectionfooter, withreuseidentifier: collectionfooterid)
|
注:不要实现uicollectionviewdelegateflowlayout的代理方法了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/yj229201093/article/details/52121925