UICollectionView探究

UICollectionView簡介

UICollectionView是iOS6添加的一個控件夜畴,是一種新的數(shù)據(jù)展示方式吮炕,簡單來說可以把他理解成多列的UITableView,最簡單的UICollectionView就是一個GridView钱床,可以以多列的方式將數(shù)據(jù)進行展示。
標準的UICollectionView包含三個部分惩猫,它們都是UIView的子類:
Cells 用于展示內(nèi)容的主體,對于不同的cell可以指定不同尺寸和不同的內(nèi)容
Supplementary Views 追加視圖蚜点,可以理解為每個Section的Header或者Footer轧房,用來標記每個section的view
Decoration Views 裝飾視圖 這是每個section的背景

實現(xiàn)一個簡單的UICollectionView

實現(xiàn)一個UICollectionView和實現(xiàn)一個UITableView基本沒有什么大區(qū)別,它們都同樣是datasource+delegate

基本的UICollectionViewDataSource提供
<pre><code>
-numberOfSectionsInCollection: //section的數(shù)量
-collectionView:numberOfItemsInSection: //某個section里有多少個item
-collectionView:cellForItemAtIndexPath: // 對于某個位置應(yīng)該顯示什么樣的cell

-collectionView:viewForSupplementaryElementOfKind:atIndexPath: //提供Supplementary View
</code></pre>

與UITableView中的情況一致绍绘,UICollectionView也需要對Cell進行重用奶镶,在iOS5中,Apple對UITableView的重用做了簡化陪拘,以往要寫類似這樣的代碼:
<pre><code>
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MY_CELL_ID"];
if (!cell) {
cell = [[UITableViewCell alloc] init];
}
//配置cell厂镇,blablabla
return cell
</code></pre>
在iOS5以后如果我們在TableView向數(shù)據(jù)源請求數(shù)據(jù)之前使用-registerNib:forCellReuseIdentifier:方法為@“MYCELLID"注冊過nib的話,就可以省下每次判斷并初始化cell的代碼左刽,要是在重用隊列里沒有可用的cell的話捺信,runtime將自動幫我們生成并初始化一個可用的cell,還有以下類似方法
<pre><code>

  • (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0);

  • (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);

  • (void)registerNib:(UINib *)nib forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);

  • (void)registerClass:(Class)aClass forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);
    </code></pre>

同樣的 UICollectionView也有類似的方法
<pre><code>

  • (void)registerClass:(Class)cellClass forCellWithReuseIdentifier:(NSString *)identifier;

  • (void)registerNib:(UINib *)nib forCellWithReuseIdentifier:(NSString *)identifier;

  • (void)registerClass:(Class)viewClass forSupplementaryViewOfKind:(NSString *)elementKind withReuseIdentifier:(NSString *)identifier;

  • (void)registerNib:(UINib *)nib forSupplementaryViewOfKind:(NSString *)kind withReuseIdentifier:(NSString *)identifier;
    </code></pre>

基本的UICollectionViewDelegate提供與數(shù)據(jù)無關(guān)的view的外形欠痴,用戶交互之類:

cell的高亮
cell的選中狀態(tài)
可以支持長按后的菜單
關(guān)于用戶交互迄靠,UICollectionView也做了改進。每個cell現(xiàn)在有獨立的高亮事件和選中事件的delegate喇辽,用戶點擊cell的時候掌挚,現(xiàn)在會按照以下流程向delegate進行詢問:
<pre><code>
-collectionView:shouldHighlightItemAtIndexPath: // 是否應(yīng)該高亮?
-collectionView:didHighlightItemAtIndexPath: //如果1答是菩咨,那么高亮
-collectionView:shouldSelectItemAtIndexPath: //無論1結(jié)果如何吠式,都詢問是否可以被選中?
-collectionView:didUnhighlightItemAtIndexPath: // 如果1答是抽米,那么現(xiàn)在取消高亮
-collectionView:didSelectItemAtIndexPath: // 如果3答是奇徒,那么選中cell
</code></pre>

Cell

UICollectionViewCell結(jié)構(gòu)比較簡單, 由上至下
首先是cell本身作為容器view
然后是一個大小自動適應(yīng)整個cell的backgroundView缨硝,用作cell平時的背景
再其上是selectedBackgroundView,是cell被選中時的背景
最后是一個contentView罢低,自定義內(nèi)容應(yīng)被加在這個view上

UICollectionViewLayout

這是UICollectionView和UITableView最大的不同查辩。UICollectionViewLayout負責了將各個cell、Supplementary View和Decoration Views進行組織网持,為它們設(shè)定各自的屬性宜岛。在展示之前,一般需要生成合適的UICollectionViewLayout子類對象功舀,并將其賦予CollectionView的collectionViewLayout屬性萍倡。
SDK為我們提供了一個最簡單可能也是最常用的默認layout對象,UICollectionViewFlowLayout辟汰。Flow Layout簡單說是一個直線對齊的layout列敲,最常見的Grid View形式即為一種Flow Layout配置:

首先一個重要的屬性是itemSize阱佛,它定義了每一個item的大小。通過設(shè)定itemSize可以全局地改變所有cell的尺寸戴而,如果想要對某個cell制定尺寸凑术,可以使用-collectionView:layout:sizeForItemAtIndexPath:方法。
間隔 可以指定item之間的間隔和每一行之間的間隔所意,和size類似淮逊,有全局屬性,也可以對每一個item和每一個section做出設(shè)定:
<pre><code>
@property (CGSize) minimumInteritemSpacing
@property (CGSize) minimumLineSpacing
-collectionView:layout:minimumInteritemSpacingForSectionAtIndex:
-collectionView:layout:minimumLineSpacingForSectionAtIndex:
</code></pre>
滾動方向 由屬性scrollDirection確定scroll view的方向扶踊,將影響Flow Layout的基本方向和由header及footer確定的section之間的寬度

UICollectionViewScrollDirectionVertical
UICollectionViewScrollDirectionHorizontal
Header和Footer尺寸 同樣地分為全局和部分泄鹏。需要注意根據(jù)滾動方向不同,header和footer的高和寬中只有一個會起作用秧耗。垂直滾動時section間寬度為該尺寸的高备籽,而水平滾動時為寬度起作用,如圖绣版。
<pre><code>
@property (CGSize) headerReferenceSize
@property (CGSize) footerReferenceSize
-collectionView:layout:referenceSizeForHeaderInSection:
-collectionView:layout:referenceSizeForFooterInSection:
</code></pre>
縮進
<pre><code>
@property UIEdgeInsets sectionInset;
-collectionView:layout:insetForSectionAtIndex:
</code></pre>
通過自定義Layout可以實現(xiàn)各種nb布局胶台,基本上常見的類似的第三方開源控件效果都可以實現(xiàn),比如瀑布流杂抽、coverFlow诈唬,下面實現(xiàn)一個基本的瀑流效果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缩麸,隨后出現(xiàn)的幾起案子铸磅,更是在濱河造成了極大的恐慌,老刑警劉巖杭朱,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阅仔,死亡現(xiàn)場離奇詭異,居然都是意外死亡弧械,警方通過查閱死者的電腦和手機八酒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刃唐,“玉大人羞迷,你說我怎么就攤上這事』ⅲ” “怎么了衔瓮?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抖甘。 經(jīng)常有香客問我热鞍,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任薇宠,我火速辦了婚禮偷办,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昼接。我一直安慰自己爽篷,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布慢睡。 她就那樣靜靜地躺著逐工,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漂辐。 梳的紋絲不亂的頭發(fā)上泪喊,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音髓涯,去河邊找鬼袒啼。 笑死,一個胖子當著我的面吹牛纬纪,可吹牛的內(nèi)容都是我干的蚓再。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼包各,長吁一口氣:“原來是場噩夢啊……” “哼摘仅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起问畅,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤娃属,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后护姆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矾端,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年卵皂,在試婚紗的時候發(fā)現(xiàn)自己被綠了秩铆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡灯变,死狀恐怖殴玛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柒凉,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布篓跛,位于F島的核電站膝捞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔬咬,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一鲤遥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧林艘,春花似錦盖奈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啥酱,卻和暖如春爹凹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镶殷。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工禾酱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绘趋。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓颤陶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陷遮。 傳聞我的和親對象是個殘疾皇子滓走,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 概述 UICollectionView是iOS開發(fā)中最常用的UI控件之一,可以用它來管理一組有序的不同尺寸的視圖拷呆,...
    漸z閱讀 2,955評論 0 3
  • //聯(lián)系人:石虎 QQ: 1224614774昵稱:嗡嘛呢叭咪哄 什么是UICollectionView UICo...
    石虎132閱讀 3,397評論 0 15
  • 什么是UICollectionView闲坎? UICollectionView是一種新的數(shù)據(jù)展示方式,簡單來說可以把他...
    凌峰Mical閱讀 43,205評論 11 201
  • UICollectionView的學(xué)習(xí)可以對比著UITableView來茬斧,因為這兩個類很相似腰懂,實現(xiàn)途徑也很相似。它...
    蘇宇lovecc閱讀 908評論 0 1
  • 昨天吃飯的時候项秉,想著爸媽就要回家了绣溜,頓覺傷感。不知怎么的突然就想跟老媽撒嬌娄蔼,抱著她手臂靠在她身上怖喻。 她吃著吃著,望...
    張洲澤_閱讀 249評論 0 0