自定义布局cho UICollectionView ???


Chàomọingười❤Đãlâulắmrồimìnhmớingồiviếtmộtbàimới。 Mìnhgầnnhưquênluônmụctiêutừlulúcbắtđầuviếtnhữngbàiđầutiên:))))Chắchẳnlàdoquálườimànên:’(

自定义UICollectionView,自定义布局布局自定义布局:。:môôôôôUI UI UI UI UI UI N UIubạnđãquenlàmviệcvớiUICollectionViewthìsẽbiếtnó“ ngon”nhưthếnào:3Cóthểkểtớinhưkhảnăngcustomvôhạn,内置动画vàtrongnhữngnămgầnquamứta,我的UICollectionView具有良好的效果。

Trongphạmvibàiviếtnàymìnhsẽkhôngnóichitiếtcách工具实施自定义布局màchỉnóitớicáckháiniệmvàlýthuyếtquantrọngcầnbiết。 Mìnhsẽđínhkèmmộtsốhướngdẫncụthđểđểđểcuốibàiviết。

Nhưcácbạnđãbiết,UITableView,UICollectionViewtáchbiệtphần布局和数据源riêngbiệt。 布局对象(UICollectionViewLayout)的布局,UICollectionView,数据源的视图,布局视图,布局对象的cung; UITableView的外观1布局dunnhấtkhôngthểcustom,chỉcóthểtuỳbiếnmộtthuộctínhthôngqua委托。 Collection UICollectionView,m layoutithểlo layouti layoutvớinó,ngang,dọc,grid,dạngstack,rồicókhicảhìnhtròn=)))

在iOS 6中,Apple可以选择具体类的UICollectionViewLayout和UICollectionViewFlowLayout。 流布局đểcdùngđể实现các布局dạng网格,đ用例phổbiếnnhấtcủa集合视图通过iOS,TACóthểyấphầnlớncácappmặcđịnhcủniOS,nhưPhotos集合视图。

流程布局

流布局基于行的布局,布局对象可以是x,pcếc项目trênmộthàng,vànósẽtínhtoánlàmsaođểcóthểchứacàngnhiều项目trênhàngtđc。 tớikhikhôngcònthểnhétthêmbấtcứ项目nàonữathìnósẽtạoramộthàngmớivàbắtđầulặplạicôngviệcnàychođếnkhihếttấtcả项目。 Nếucónhiềusectionthìsẽlayout chođếnkhihếtitems trong sectionđóvàbắtđầusectionmới。

流程布局滚动显示(1滚动方向),垂直向水平。 垂直滚动项目,水平布局项目,水平滚动项目。

布局错误,cácitemstrêncùngmộthàngsẽcanc canhchínhgiữahàngđó。

Ngoàira,流程布局còchophépchúngtatuỳchỉnhthêmmộtsốthuộctính,vídụnhư:线间距và项间间距干草插入点của截面。 Xemthêm: 定制流布局属性

Nếu流布局đãgầnhh cungcấpấyđủnhữngthứtacầnthìkhinàochúngtacần自定义布局:

  • Nếukhôngmuốn1布局基于行的干草网格(hìnhtrònnhưđãnóiởtrên:)))
  • 完全掌控元素布局,一切都在掌控之中。 Thêmcác补充了干草装饰视图vàđặtchúngởmọivịtrí,chứkhôngchỉ页眉干草页脚视图mà支持流布局sẵn。
  • 布局:3布局布局对象布局​​对象布局​​对象布局​​对象布局​​对象布局​​对象布局​​对象布局​​对象布局​​对象布局​​对象布局​​对象布局​​对象布局​​对象布局​​对象布局​​对象布局​​对象布局​​对象布局​​对象。

核心布局过程

布局对象可以通过集合视图进行布局过程。 Khi集合视图cầnthôngtincủa布局,nósẽhỏi布局对象cungcấpnhữngthôngtinđó。 布局对象可以从数据源中获取布局。 视频:numberOfSections,numberOfItemsInSection,…

自定义布局,子类UICollectionViewLayoutđểtuỳbiến,sẽcómộtsốbướcchính,cũngnhưcác方法đikèmnhưsau:

1.prepareLayout :đđong trong布局过程。 elementsàlàlúcchúngtaphảithựchiệnmộtsốtínhtoánđểxácđịnhđượcvịtrícủacác元素的总体布局。 基于框架的布局元素,可以基于框架(手动布局)查看视图。 可以将元素的属性(对象类UICollectionViewLayoutAttributes )添加到属性中。 Kếtthúcbướcnày,chúngtatốithiểuphảicóđược内容大小cho集合视图。 视频:2个项,滚动方向为垂直1个栏,项1为帧là(0,0,100,100),项2(0,100,100,100)。 内容大小sẽlàtổngcủa2项目trên(100,200)。

2.collectionViewContentSize :内容大小1。b1.cnàychúngtachỉcầntrảvềkếtquđảó。 集合视图可容纳内容大小để配置可滚动视图。 N contentu内容大小lớnhơn边界c集合视图,可滚动的内容。

3.layoutAttributesForElementsInRect :滚动查看集合视图,此集合视图显示属性,并以矩形为单位布局(nhưhìnhdưới)。 visibleễễhiểuthìchúngtacógiảsửyylà可见区域(vùngđượchiểnthịtrênmànhình)。 苹果(theonhưApple),可见区域中的矩形,预取预取结果:v(不显示布局,即滚动显示)。

Tuỳvàochiếnlượccủatừngngười,sìcungcấp属性具有mộtcáchkhácnhau。 Mộtsốngườisẽbắtc cungcấp属性(y yyhiểulàtạora实例củaUICollectionViewLayoutAttributes,ởbước准备chỉcầntínhtoánsao chocóđược内容大小)chhi khithesưtribu x, chưađượctính,thìtớilúcđósẽtính。 Còvớibảnthânmình,nếusốnglượngelementskhôngquánhiều(hàngtriệu,chụctriệu)haysốlượngkhôngthayđổithườngxuyênthìmìnhsẽcấcước attributesp attribute cho Banđầuchậmhơnmộttí,nhưngđổilạicảmgiácscrollmượtmàhơn。

Sau khicácbướctrênhoàntất,布局过程kếtthúc,属性củatấtcảcác元素sẽcgiữnguyênchođếnkhinhậnđượcbấtkỳlnnh使布局nàođượcgọ无效。 准备布局过程,然后准备prepareLayout 。 事件invalidateLayout可以滚动到x轴上的chíkhichúng滚动。 滚动视图集合视图,集合视图s shouldgọishouldInvalidateLayoutForBoundsChangeểkiểmtra layouthiệntạivẫncònòúngkhônghaynóphảicầntínhtoánlại 。 Khiviết自定义布局ìylươphươngthọcquantrọngcầnphảibiết,đểcóthểlàmmộtsốthứnhư:实现粘滞表头nhưcủa表视图,hoặcthayđổivịtrícíathđểnóluônhi区域。 Chúngtacần覆盖hàmnàyvà返回YES。 Nhưvậymỗilần滚动,请更新lểi布局đđúngýđồ。

Nhưvídụtrên,mìnhmuốncómộtindex viewluônluônhiểnthịtrongvùngvisible(cụthểlàcạnhphải)củacollection view,mìilầnscrollmìnhphảiinvalidatelạilayoutvàạlạicho index view

Ngoàira,自定义布局为c.ngcómộtsốtròvuivẻchochúngtalàm。 Khi inserthoặcdeletemộtelementnào,集合视图sẽhỏilayout object updatelạilayout,vìđơngiảncollection viewcầnbiếtmộtsốthôngtinvídụnhưkhi insert / delete / movemộtcellthìlocationcủacellđólàở单元格khácsiđổipositionquađu(giốngnhưgọiinvalidateLayout,sẽchạylại布局过程từđầu)。 ớivớitrườnghợpmove 1件,收藏视图biếtđượcvịtríđầuvàvịtrícuốicủaitemđórồisửdụng内置动画của收藏视图vàmọiviệcđượclàmlàmààà bấtcứthứgì。 Vớitrườnghợp插入收藏集khôngbiếtvịtrííucủanólàởâu,còn删除收藏集视图khôngbiếtvịtrícuđicủanóđãuanimate。 Khi自定义布局,可以在UI / UX应用程序中创建动画,也可以在UI / UX cani应用程序中创建动画。

Nhưvídụminhhoạởtrên,chúngta提供vịtríđầucủam insertedt插入的物品làởchínhgiữa收藏夹视图,nhưvậyThì插入的物品sẽđượcanimatetừgiữavàướivềgócảcảicollection。 V deleteitrườnghợpdeletemìithứtươngtựnhưvậy。

Ch ng sẽcầphả覆盖m s số方法vàtrảvề属性cho插入/删除的项目。

  • initialLayoutAttributesForAppearingItemAtIndexPath:
  • initialLayoutAttributesForAppearingSupplementaryElementOfKind:atIndexPath:
  • initialLayoutAttributesForAppearingDecorationElementOfKind:atIndexPath:
  • finalLayoutAttributesForDisappearingItemAtIndexPath:
  • finalLayoutAttributesForDisappearingSupplementaryElementOfKind:atIndexPath:
  • finalLayoutAttributesForDisappearingDecorationElementOfKind:atIndexPath:

自定义布局,包括滚动视图,集合视图和UX。 Khi用户可以触摸滚动条,滚动视图集合,然后滚动滚动查看(干草含量偏移量)。 布局对象的更改方法targetContentOffsetForProposedContentOffset:withScrollingVelocity:配置内容的偏移量(返回目标内容的偏移量)滚动滚动的内容。 地点:可见区域c collectiona集合视图(hìnhbêndưới)。

无效过程

Nhưcóđềcởpởtrên,nếureturn shouldInvalidateLayoutForBoundsChangebằngYESthìmỗikhi boundscủacollection view thayđổithìsẽcầnupdatelạilayoutvàtrongsuốtquátrìnhc thnìcìệẽ(((( vệiviệc布局过程> lag lag h Apple Apple Apple Apple Apple Apple Apple Apple…Apple Apple Apple ay Apple Apple Apple Apple Apple Apple Apple Apple Apple Apple Apple UI Apple ,mỗilầnscroll,chúngtaphảitínhtoánlạitoànbộ布局,thay thayvàođóchỉcầntínhnhữngphầncầnthiết(vd:tínhlạiposition cho sticky header)。

Mànóiđicũngnóilại,khổnỗithằng苹果cho chocái无效上下文 ?? ???? oi1wiod1hi9coip1bpcu1uc…..

án!!! Google的Saumộthồith,Google,在UI上使用Layout的UI布局中的UIUI布局vCollection pháthiện,mỗilầnscrollthìtứgựicủalayoutsẽnhẽsau:

  1. shouldInvalidateLayoutForBoundsChange
  2. invalidationContextForBoundsChange
  3. invalidateLayoutWithContext
  4. prepareLayout。

ốbướcsố2,返回无效的上下文vàmìnhđoánđâysẽlàbướcchúngta config cho无效上下文đ。 试一下!!! 更改标记元素可以更新布局,请使用invalidateItemsAtIndexPaths / invalidateSupplementaryElementsOfKind / invalidateDecorationElementsOfKind (对象上下文) 已标记的元素需要更新布局s layoutAttributesForItemAtIndexPath / layoutAttributesForSupplementaryViewOfKind / layoutAttributesForDecorationViewOfKind属性(更新布局偏移量)准备布局c。 答对了!!! 完成!!!

//注意:标记需要更新càthàlàmởbước3cũngđược😀

注意:请注意,请调用invalidateLayout ,然后在下一个更新周期(sẽnóichitiếttrongbàiviếtkhác)中对布局进行更新。布局更新s invalidkhôngdiễnra ngaylậptứcmàphảiđợitới。 请设置setNeedsDisplay

参考文献:

创建自定义布局-Apple

适用于iOS的Collection View编程指南-Apple

UICollectionView自定义布局教程— Ray Wenderlich

自定义UICollectionViewLayout教程— Ray Wenderlich

视频系列:自定义收藏集视图布局

Mìnhxincảmơncácbạnđãdànhthờigianđọchếtnhữngdòngmìnhviếtra。 Hẹnmọingườivàobàiviếtsau。 Nếucóbấtcứsaisótgìtrongbàithìmọingườihãy评论đểchomìnhbiếtvàchỉnhsửanhé❤