iOS使用UICollectionView实现列表头部拉伸效果
程序员文章站
2023-12-18 09:20:58
本文实例为大家分享了ios实现列表下拉放大效果展示的具体代码,供大家参考,具体内容如下
先看效果图
突然发现没有做出来之前都觉得蛮难的,做出来之后就觉得so eas...
本文实例为大家分享了ios实现列表下拉放大效果展示的具体代码,供大家参考,具体内容如下
先看效果图
突然发现没有做出来之前都觉得蛮难的,做出来之后就觉得so easy 大家都有这样的感触吧
做这个就重写 uicollectionviewflowlayout 的几个方法就可以
oc版本
创建一个类 customcollectionviewflowlayout 继承 uicollectionviewflowlayout
// // 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
在控制器中使用 先导入头文件
// 创建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 不需要导入头文件那么麻烦
// // 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方法实现
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的代理方法了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。