UICollectionView-Part1

1.概況:

UICollectionView自iOS6.0以后就有了這個組件.以前還考慮著不敢用.不過隨著iOS9的到來,除了少量項目因為歷史原因以外,大部分項目都應(yīng)該支持iOS7以上了吧.所以,大膽使用.

初識UICollectionView,蠻復(fù)雜的,很多概念,什么Supplementary View,什么Decoration View.不過不用怕,它就是一個靈活版的UITableView.

UITableView大家很熟悉.就是定義一個table view,實現(xiàn)一個數(shù)據(jù)源的代理即可:告訴這個table view一共有多少個section,每個section有多少個row,每個row應(yīng)該怎么顯示就ok.

UICollectionView也是同樣的.定義一個collection view,實現(xiàn)一個數(shù)據(jù)源代理:告訴這個collection view一共有多少個section,每個section有多少個row,每個row應(yīng)該怎么顯示.

2.一個簡單的grid排版:

在這里我們使用xib

拖入一個UICollectionView.

同UITableView一樣,我們通過連線將其data source和delegate設(shè)置為其owner.

然后在view controller里面實現(xiàn)代理方法,告訴collection view具體有多少個cell:

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

迄今為止,使用方式上沒有任何和table view不一樣的地方.當(dāng)然了,api本身有一定的區(qū)別=.=

接下來,同UITableview一樣的是,我們需要實現(xiàn)該方法,以告訴collection view每個cell怎么顯示:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

我們可以建立UICollectionViewCell的子類,然后通過collection view進行注冊使用:

- (void)registerClass:(Class)cellClass forCellWithReuseIdentifier:(NSString *)identifier;
- (void)registerNib:(UINib *)nib forCellWithReuseIdentifier:(NSString *)identifier;

和UITableView一模一樣啊.

好了,不一樣的地方來了.UITableView需要一個代理告訴它每一個cell有多高,默認44.而每一個cell的長度就是table view本身的長度,所以每一個cell的size的width為table view本身的width,高度為代理的高度(默認44).

而collection view則要靈活很多,我們可以任意指定每一個cell的size,甚至是frame.基于目前的這個grid排版,我們可以用代理來指定每一個cell的size:

  • 引入UICollectionViewDelegateFlowLayout,它繼承自UICollectionViewDelegate
  • 也可以不引入該代理.只要有UICollectionViewDelegate,其代理方法就有效.引入于不引入的區(qū)別就是xCode是否會自動提示相關(guān)代碼.
  • 實現(xiàn)代理中的方法方法.蘋果SDK的命名習(xí)慣帶來的最大的好處,就是你一眼就能看懂方法是什么意思.

更為簡便的是直接設(shè)置xib中的屬性,如圖:

cell相關(guān)設(shè)置

通俗易懂,cell/header/footer的size,min spaceing等/xib可見即所得,隨意修改一下數(shù)字,就會產(chǎn)生變化.應(yīng)該很容易上手.

設(shè)置完畢以后,一個grid的排版就完了...以前table view要處理很多的,現(xiàn)在一下子就能搞定..真是很強大.

剩下的工作,你可以查看UICollectionViewDataSource等幾個代理方法.基本上代理的方法能滿足絕大部分需求了.

3.一些稍復(fù)雜的概念:

Supplementary View約等于table view中的section header/footer,是一個類型為:UICollectionReusableView的東西.在UICollectionView中,判定是header還是footer的依據(jù)是一個叫做kind的東西,kind是一個const字符串:

UICollectionElementKindSectionHeader
UICollectionElementKindSectionFooter.

UICollectionView的核心在于一個叫做UICollectionViewLayout的東西.由他來決定整個UICollectionView的方方面面.UICollectionViewLayout一個大的行為Model,它主要控制著整個collection view的布局/行為/顯示等邏輯.

在xib上直接拖入的UICollectionView,默認使用了UICollectionViewFlowLayout,SDK內(nèi)置的一個layout.

而UICollectionViewLayout中最最最核心的數(shù)據(jù)模型是一個叫做:UICollectionViewLayoutAttributes的東西.它存儲了每一個cell的數(shù)據(jù)模型,包括frame,center,size,transform,alpha等等.也就是說它決定了一個cell在什么地方以怎樣的形式顯示.而我們自定義的cell主要決定在某個確切的地方,這個cell展示的內(nèi)容.

復(fù)雜的collection view,通常會自定義UICollectionViewLayout.在自定義的UICollectionViewLayout里面.有2個方法非常核心,我們需要重載他.

根據(jù)table view的思路,我們可以先思考一下.

table view是個scroll view,可以滑動.那么一定是有一個content size的概念.table view的content size是多少呢?我們可以根據(jù)代理來計算.我們知道數(shù)據(jù)源的個數(shù)以及每一個cell的高度,那么content size通過計算就很容易得出了.

而當(dāng)我們滑動table view的時候,table view又怎么知道應(yīng)該顯示什么內(nèi)容呢?原理很簡單,因為table view是scroll view,所以可以知道當(dāng)前的content offset.通過數(shù)據(jù)源及每一cell的高度,結(jié)合content offset就知道當(dāng)前顯示到哪一行了.

可是自定義UICollectionViewLayout的UICollectionView并不知道這些數(shù)據(jù)(每個cell的size,frame均可以自定義),所以他就無法自動計算content size以及當(dāng)前應(yīng)該展示哪些cell.

所以我們就需要通過重載方法告訴它:

告訴它應(yīng)該有多少content size

- (CGSize)collectionViewContentSize

告訴他針對任意時刻,collection view應(yīng)該展示那些數(shù)據(jù).rect表示當(dāng)前可以被看到的區(qū)域,返回值是一個array,表示可以展示的數(shù)據(jù)是一個集合.

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect

有了這2個方法,collection view就可以知道,自己的content size有多大.就可以痛快的滑動了.并且在滑動的過程中,就可以知道,應(yīng)該如何展示數(shù)據(jù)了.

4.實戰(zhàn)一個自定義UICollectionViewLayout

下一篇來嘗試一個簡單的自定義layout,如下圖.

橫向文字排版
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末结洼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子岛杀,更是在濱河造成了極大的恐慌葵诈,老刑警劉巖堤撵,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馒闷,死亡現(xiàn)場離奇詭異架馋,居然都是意外死亡帅刊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門没讲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眯娱,“玉大人,你說我怎么就攤上這事爬凑。” “怎么了试伙?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵嘁信,是天一觀的道長。 經(jīng)常有香客問我疏叨,道長潘靖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任蚤蔓,我火速辦了婚禮卦溢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秀又。我一直安慰自己单寂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布吐辙。 她就那樣靜靜地躺著宣决,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昏苏。 梳的紋絲不亂的頭發(fā)上尊沸,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天威沫,我揣著相機與錄音,去河邊找鬼洼专。 笑死棒掠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屁商。 我是一名探鬼主播句柠,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棒假!你這毒婦竟也來了溯职?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤帽哑,失蹤者是張志新(化名)和其女友劉穎谜酒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妻枕,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡僻族,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了屡谐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片述么。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖愕掏,靈堂內(nèi)的尸體忽然破棺而出度秘,到底是詐尸還是另有隱情,我是刑警寧澤饵撑,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布剑梳,位于F島的核電站,受9級特大地震影響滑潘,放射性物質(zhì)發(fā)生泄漏垢乙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一语卤、第九天 我趴在偏房一處隱蔽的房頂上張望追逮。 院中可真熱鬧,春花似錦粹舵、人聲如沸钮孵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽油猫。三九已至,卻和暖如春柠偶,著一層夾襖步出監(jiān)牢的瞬間情妖,已是汗流浹背睬关。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毡证,地道東北人电爹。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像料睛,于是被迫代替她去往敵國和親丐箩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

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