集合視圖基本知識(shí)
為了將其內(nèi)容呈現(xiàn)在屏幕上酌呆,集合視圖與許多不用的對(duì)象配合使用疗锐。有些對(duì)象是自定義的坊谁,并且必須由你的應(yīng)用程序提供。例如滑臊,你的app必須提供一個(gè)數(shù)據(jù)源對(duì)象口芍,來(lái)告訴集合視圖有哪多少個(gè)items
要顯示。其他對(duì)象由UIKit
來(lái)提供雇卷,也是基本集合視圖設(shè)計(jì)的一部分鬓椭。
與表視圖類似,集合視圖是面向數(shù)據(jù)對(duì)象关划,其實(shí)現(xiàn)涉及與你的app的對(duì)象的協(xié)作小染。了解在你的代碼中你必須做什么,需要一些關(guān)于集合視圖如何執(zhí)行操作的背景信息贮折。
集合視圖是對(duì)象的協(xié)作
集合視圖的設(shè)計(jì)將 數(shù)據(jù)從數(shù)據(jù)排列和顯示的方式分離開(kāi)來(lái)裤翩。雖然你的app嚴(yán)格負(fù)責(zé)管理要呈現(xiàn)的數(shù)據(jù),但它的可視化呈現(xiàn)是由許多不同的對(duì)象來(lái)管理的调榄。表1-1列出了在UIKit中的集合視圖類和在實(shí)現(xiàn)集合視圖接口中的角色進(jìn)行組織踊赠。大多數(shù)類被設(shè)計(jì)為被使用而不需要進(jìn)行子類化,因此你通趁壳欤可以使用很少的代碼來(lái)實(shí)現(xiàn)集合視圖筐带,當(dāng)你想超越提供的行為,你可以子類化并提供這種行為缤灵。
表1-1 用于實(shí)現(xiàn)集合視圖的類和協(xié)議
目的 | 類/協(xié)議 | 描述 |
---|---|---|
頂級(jí)容量和管理 |
UICollectionView UICollectionViewController
|
一個(gè)集合視圖對(duì)象定義了你的集合視圖內(nèi)容的可見(jiàn)區(qū)域伦籍。這個(gè)類起源于UIScrollView ,當(dāng)需要的時(shí)候能夠包含一個(gè)大的滾動(dòng)區(qū)域凤价。 這個(gè)類還可以根據(jù)它從布局對(duì)象接收到的布局信息來(lái)方便地顯示數(shù)據(jù)鸽斟。一個(gè)集合視圖控制器對(duì)象為集合視圖提供了視圖控制器級(jí)別的管理。它的使用是可選的利诺。 |
內(nèi)容管理 |
UICollectionViewDataSource 協(xié)議UICollectionViewDelegate 協(xié)議 |
數(shù)據(jù)源對(duì)象是與集合視圖關(guān)聯(lián)最重要的對(duì)象并且是你必須提供的一個(gè)富蓄。數(shù)據(jù)源管理集合視圖的內(nèi)容并創(chuàng)建呈現(xiàn)該內(nèi)容的視圖。為了實(shí)現(xiàn)數(shù)據(jù)源對(duì)象慢逾,你必須創(chuàng)建一個(gè)遵守UICollectionViewDataSource 協(xié)議的對(duì)象立倍。集合視圖委托對(duì)象允許你從集合視圖截取有趣的消息灭红,并自定義視圖的行為。例如口注,你使用委托對(duì)象來(lái)跟蹤集合視圖中的item的選擇和高亮变擒。不像數(shù)據(jù)源對(duì)象,委托對(duì)象是可選的寝志。關(guān)于如何實(shí)現(xiàn)數(shù)據(jù)源和委托對(duì)象娇斑,請(qǐng)看Designing Your Data Source and Delegate. |
呈現(xiàn)層 |
UICollectionReusableView UICollectionViewCell
|
在集合視圖上的所有視圖顯示必須是UICollectionReusableView 類的實(shí)例。這個(gè)類提供了一個(gè)集合視圖的回收利用機(jī)制材部『晾拢回收視圖(代替創(chuàng)建新視圖)通常會(huì)提高性能,特別是在滾動(dòng)的過(guò)程中乐导。 UICollectionViewCell對(duì)象是你用于主數(shù)據(jù)項(xiàng)的特定類型的可重用視圖苦丁。 |
布局 |
UICollectionViewLayout UICollectionViewLayoutAttributes UICollectionViewUpdateItem
|
UICollectionViewLayout 的子類稱為布局對(duì)象,負(fù)責(zé)定義集合視圖內(nèi)的cells和可重用視圖的位置物臂,大小和視覺(jué)屬性旺拉。 在布局過(guò)程中,布局對(duì)象創(chuàng)建布局屬性對(duì)象(UICollectionViewLayoutAttributes 的實(shí)例),該對(duì)象告訴集合視圖在何處和如何顯示cells和可重用視圖棵磷。 每當(dāng)集合視圖中插入蛾狗、刪除、或移動(dòng)數(shù)據(jù)項(xiàng)時(shí)泽本,布局對(duì)象接收UICollectionViewUpdateItem 類的實(shí)例淘太,你不需要自己創(chuàng)建這個(gè)類的實(shí)例姻僧。 關(guān)于布局對(duì)象更多信息规丽,請(qǐng)看The Layout Object Controls the Visual Presentation. |
流式布局 |
UICollectionViewFlowLayout UICollectionViewDelegateFlowLayout 協(xié)議 |
UICollectionViewFlowLayout 類是用于實(shí)現(xiàn)網(wǎng)格或其他基于行的布局的具體布局對(duì)象。你可以按照原樣使用該類撇贺,或者與流式委托對(duì)象一起使用赌莺,可以動(dòng)態(tài)自定義布局信息。 |
圖1-1顯示與集合視圖相關(guān)的核心對(duì)象之間的關(guān)系松嘶。集合視圖從它的數(shù)據(jù)源獲取關(guān)于cells
來(lái)顯示的信息艘狭。數(shù)據(jù)源和委托對(duì)象是由你的app提供的自定義對(duì)象并用來(lái)管理cells
的內(nèi)容,包括選擇和高亮翠订。布局對(duì)象負(fù)責(zé)決定這些cells
所在的位置巢音,并以一個(gè)或多個(gè)布局屬性對(duì)象的形式將該信息發(fā)送給集合視圖。然后尽超,集合視圖將布局信息與實(shí)際cells
(和其他視圖)合并官撼,以創(chuàng)建最終的可視化呈現(xiàn)。
當(dāng)創(chuàng)建一個(gè)集合視圖界面時(shí)似谁,你先要添加一個(gè)UICollectionView
對(duì)象到你的故事板或nib文件中傲绣。將集合視圖看作是中心焦點(diǎn)掠哥,所有其他對(duì)象都來(lái)自這個(gè)中心。添加該對(duì)象后秃诵,你就可以開(kāi)始配置其他相關(guān)對(duì)象续搀,例如數(shù)據(jù)源和代理。所有配置都以集合視圖本身為中心菠净。例如禁舷,你沒(méi)有創(chuàng)建一個(gè)集合視圖對(duì)象,就從不創(chuàng)建一個(gè)布局對(duì)象
可重用視圖提高性能
集合視圖采用視圖回收程序來(lái)提高效率毅往。當(dāng)視圖移出屏幕榛了,它們將從視圖中移除,并放置在重用隊(duì)列中煞抬,而不是被刪除霜大。當(dāng)新的內(nèi)容滾動(dòng)到屏幕上,視圖從隊(duì)列中移除并重新利用到新的內(nèi)容上革答。為了方便這種循環(huán)和重用战坤,集合視圖上顯示的所有視圖,必須繼承自UICollectionReusableView
類残拐。
集合視圖支持三種不同類型的可重用視圖途茫,每種都有特定的預(yù)期用途:
-
cells
代表你的集合視圖的主內(nèi)容。cell
的工作是用來(lái)呈現(xiàn)來(lái)自于你的數(shù)據(jù)源對(duì)象的單獨(dú)item
的內(nèi)容溪食。每個(gè)cell
必須是UICollectionViewCell
類的實(shí)例囊卜,你可以根據(jù)需要來(lái)進(jìn)行子類化來(lái)呈現(xiàn)你的內(nèi)容。cell
對(duì)象為管理自己的選擇和高亮狀體提供了固有的支持错沃。要將高亮應(yīng)用于cell
栅组,你必須寫一些自定義代碼。關(guān)于實(shí)現(xiàn)cell
的高亮/選中,請(qǐng)看Managing the Visual State for Selections and Highlights. - 補(bǔ)充視圖顯示關(guān)于一個(gè)部分的信息枢析。與
cell
一樣的是玉掸,補(bǔ)充視圖也是數(shù)據(jù)驅(qū)動(dòng)的。與cell
不一樣的是醒叁,補(bǔ)充視圖不是強(qiáng)制性的司浪,它們的用法和布局 由使用的布局對(duì)象來(lái)控制。例如把沼,流式布局支持頁(yè)眉和頁(yè)腳作為可選的補(bǔ)充視圖啊易。 - 裝飾視圖是由布局對(duì)象完全擁有的視覺(jué)裝飾,并不與數(shù)據(jù)源對(duì)象中的任何數(shù)據(jù)相關(guān)聯(lián)饮睬。例如租谈,一個(gè)布局對(duì)象可能使用裝飾視圖來(lái)實(shí)現(xiàn)一個(gè)自定義背景的外觀。
與表視圖不同续捂,集合視圖不會(huì)對(duì)數(shù)據(jù)源提供的cell
和補(bǔ)充視圖施加特定風(fēng)格垦垂。相反宦搬,基本的可重用視圖類是你可以修改的空白畫布。例如劫拗,你可以用它們來(lái)構(gòu)建小視圖層級(jí)间校,來(lái)顯示圖片,甚至動(dòng)態(tài)繪制內(nèi)容页慷。
你的數(shù)據(jù)源對(duì)象負(fù)責(zé)提供其關(guān)聯(lián)的集合視圖使用的cell
和補(bǔ)充視圖憔足。然而,數(shù)據(jù)源從不直接創(chuàng)建視圖酒繁。當(dāng)被要求查看時(shí)滓彰,你的數(shù)據(jù)源將使用集合視圖的方法來(lái)將所需類型的視圖列出。出隊(duì)列過(guò)程總是返回一個(gè)有效的視圖州袒,無(wú)論是通過(guò)從重用隊(duì)列中檢索一個(gè)或通過(guò)使用你提供的類揭绑、nib文件或故事板來(lái)創(chuàng)建新視圖。
關(guān)于如何從你的數(shù)據(jù)源來(lái)創(chuàng)建和配置視圖郎哭,請(qǐng)看Configuring Cells and Supplementary Views.
布局對(duì)象控制視覺(jué)化呈現(xiàn)
布局對(duì)象完全負(fù)責(zé)確定集合視圖中items
的位置和視覺(jué)樣式他匪。雖然你的數(shù)據(jù)源對(duì)象提供視圖和實(shí)際內(nèi)容,但布局對(duì)象確定這些視圖的大小夸研、位置邦蜜、和其他外觀相關(guān)屬性。這種職責(zé)的分離使能夠動(dòng)態(tài)改變布局而不需要改變你的app管理的數(shù)據(jù)對(duì)象亥至。
集合視圖使用的布局過(guò)程與你的應(yīng)用程序的視圖使用的布局過(guò)程相關(guān)悼沈,但不同于此。換句話說(shuō)姐扮,不要將布局對(duì)象與layoutSubviews
方法混淆絮供,layoutSubviews
方法是用于在俯視圖中重新定位子視圖。一個(gè)布局對(duì)象從來(lái)沒(méi)有觸及直接管理的視圖溶握,因?yàn)樗鼘?shí)際上并不擁有任何這些視圖杯缺。相反,它生成集合視圖中cells
睡榆、補(bǔ)充視圖、和裝飾視圖的位置袍榆、大小等屬性胀屿、和視覺(jué)外觀。然后包雀,集合視圖的工作將這些屬性應(yīng)用到實(shí)際的視圖對(duì)象中宿崭。
布局對(duì)象如何影響集合視圖中的視圖是沒(méi)有限制的。一個(gè)布局對(duì)象可以移動(dòng)一些視圖才写,但不能一用其他視圖葡兑。它可以移動(dòng)視圖一點(diǎn)點(diǎn)奖蔓,或者它可以在屏幕上隨機(jī)的移動(dòng)它們。它甚至可以在不考慮周圍視圖的情況下重新定位視圖讹堤。例如吆鹤,布局對(duì)象如果愿意,可以在彼此頂部堆疊視圖洲守。唯一真實(shí)的限制是布局對(duì)象如何影響你的應(yīng)用程序的視覺(jué)樣式疑务。
圖1-2顯示垂直滾動(dòng)流式布局如何安排它的cells
和補(bǔ)充視圖。在垂直滾動(dòng)流式布局中梗醇,內(nèi)容區(qū)域的寬度保持不變知允,并且高度增長(zhǎng)以適應(yīng)內(nèi)容。為了計(jì)算面積叙谨,布局對(duì)象一次放置一個(gè)視圖和cell,為每個(gè)對(duì)象選擇最合適的位置温鸽。在流式布局的情況下,cell
和補(bǔ)充視圖的大小在布局對(duì)象上或通過(guò)使用委托指定為屬性手负。計(jì)算布局只是使用這些屬性放置每個(gè)視圖的問(wèn)題嗤朴。
布局對(duì)象不僅僅控制視圖的大小和位置。布局對(duì)象可以指定其他視圖相關(guān)屬性虫溜,例如它的透明度雹姊、在三維空間中的轉(zhuǎn)換以及其可見(jiàn)性(如果有的話)高于或低于其他視圖。這些屬性讓你創(chuàng)建更有趣的布局衡楞。例如吱雏,例如,你可以通過(guò)將視圖放在彼此頂部并更改z順序來(lái)創(chuàng)建cell
堆棧瘾境,或者可以使用轉(zhuǎn)換在任何軸上旋轉(zhuǎn)它們歧杏。
有關(guān)布局對(duì)象如何履行對(duì)集合視圖的責(zé)任的詳細(xì)信息,請(qǐng)看Creating Custom Layouts.
集合視圖自動(dòng)啟動(dòng)動(dòng)畫
集合視圖在基本層面上支持對(duì)動(dòng)畫的構(gòu)建迷守。當(dāng)你插入(或刪除)items
或sections
時(shí)犬绒,集合視圖通過(guò)改變來(lái)自動(dòng)動(dòng)畫影響的視圖。例如兑凿,當(dāng)你插入一個(gè)item
時(shí)凯力,插入點(diǎn)之后的item
通常會(huì)移動(dòng),來(lái)為新item
騰出空間礼华。集合視圖可以創(chuàng)建這些動(dòng)畫咐鹤,因?yàn)樗鼨z測(cè)到item
的當(dāng)前位置,并可以在插入發(fā)生后計(jì)算其最終位置圣絮。因此祈惶,它可以將每個(gè)item
從其初始位置動(dòng)畫到其最終位置。
除了動(dòng)畫插入、刪除和移動(dòng)操作之外捧请,還可以隨時(shí)使布局無(wú)效凡涩,并強(qiáng)制重新計(jì)算其布局屬性。無(wú)效的布局不直接為item
設(shè)置動(dòng)畫疹蛉;當(dāng)你使布局無(wú)效時(shí)活箕,集合視圖將顯示其新計(jì)算位置中的item
,而不對(duì)其進(jìn)行動(dòng)畫顯示氧吐。相反讹蘑,在自定義布局中,你可以使用此行為定期定位cell
并創(chuàng)建動(dòng)畫效果筑舅。
官方文檔地址:
Collection View Basic