日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

UICollectionView

發(fā)布時間:2023/11/27 生活经验 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UICollectionView 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

UICollectionView 多列的UITableView,最簡單的形式,類似于iBooks中書架的布局,書架中放著你下載的和購買的電子書。

最簡單的UICollectionView是一個GridView,可以多列的方式進行展示。

包含三部分,都是UIView的子類:

Cells 用于展示內(nèi)容主體:對不同的cell可以定制不同尺寸和不同內(nèi)容。

Supplementary Views 追加視圖: 類似于tableview中,每個Section的Header 或者 Footer,每個section的view

Decoration Views 裝飾視圖:每個section的背景,

不管一個UICollectionView的布局如何變化,這三個部件都是存在的。

實現(xiàn)一個UICollectionView和實現(xiàn)一個UITableView基本沒有什么大區(qū)別,它們都同樣是datasource和delegate設(shè)計模式的:datasource為view提供數(shù)據(jù)源,告訴view要顯示些什么東西,delegate提供一些樣式的小細節(jié)以及用戶交互的相應(yīng)。

UICollectionViewDataSource

  • section的數(shù)量 ?-numberOfSectionsInCollection: ??
  • 某個section里有多少個item ?-collectionView:numberOfItemsInSection: ?
  • 對于某個位置應(yīng)該顯示什么樣的cell ?-collectionView:cellForItemAtIndexPath:?

實現(xiàn)以上三個委托方法,基本上就可以保證CollectionView工作正常了。當(dāng)然,還有提供Supplementary View的方法

  • collectionView:viewForSupplementaryElementOfKind:atIndexPath:

對于Decoration Views,提供方法并不在UICollectionViewDataSource中,而是直接在UICollectionViewLayout類中的(因為它僅僅是視圖相關(guān),而與數(shù)據(jù)無關(guān)),放到稍后再說。

關(guān)于重用

為了得到高效的View,對于cell的重用是必須的,避免了不斷生成和銷毀對象的操作,這與在UITableView中的情況是一致的。但值得注意的時,在UICollectionView中,不僅cell可以重用,Supplementary View和Decoration View也是可以并且應(yīng)當(dāng)被重用的。

  • -registerClass:forCellWithReuseIdentifier:
  • -registerClass:forSupplementaryViewOfKind:withReuseIdentifier:
  • -registerNib:forCellWithReuseIdentifier:
  • -registerNib:forSupplementaryViewOfKind:withReuseIdentifier:

相比UITableView有兩個主要變化:是加入了對某個Class的注冊,這樣即使不用提供nib而是用代碼生成的view也可以被接受為cell了;是不僅只是cell,Supplementary View也可以用注冊的方法綁定初始化了。在對collection view的重用ID注冊后,就可以像UITableView那樣簡單的寫cell配置了:

-(UICollectionView*)collectionView:(UICollectionView*)cv cellForItemAtIndexPath:(NSIndexPath*)indexPath{

????MyCell*cell=[cvdequeueReusableCellWithReuseIdentifier:@”MY_CELL_ID”]; ????// Configure the cell's content ????cell.imageView.image=... ????returncell; }

需要吐槽的是,對collection view,取重用隊列的方法的名字和UITableView里面不一樣了,在Identifier前面多加了Reuse五個字母,語義上要比以前清晰,命名規(guī)則也比以前嚴(yán)謹(jǐn)了..不知道Apple會不會為了追求完美而把UITableView中的命名不那么好的方法deprecate掉。

UICollectionViewDelegate

數(shù)據(jù)無關(guān)的view的外形啊,用戶交互啊什么的,由UICollectionViewDelegate來負責(zé):

cell 高亮

cell 的選中狀態(tài)

長按后的菜單

關(guān)于用戶交互,UICollectionView也做了改進。每個cell現(xiàn)在有獨立的高亮事件和選中事件的delegate,用戶點擊cell的時候,現(xiàn)在會按照以下流程向delegate進行詢問:?

?

  1. -collectionView:shouldHighlightItemAtIndexPath: 是否應(yīng)該高亮?
  2. -collectionView:didHighlightItemAtIndexPath: 如果1回答為是,那么高亮
  3. -collectionView:shouldSelectItemAtIndexPath: 無論1結(jié)果如何,都詢問是否可以被選中?
  4. -collectionView:didUnhighlightItemAtIndexPath: 如果1回答為是,那么現(xiàn)在取消高亮
  5. -collectionView:didSelectItemAtIndexPath: 如果3回答為是,那么選中cell

狀態(tài)控制要比以前靈活一些,對應(yīng)的高亮和選中狀態(tài)分別由highlighted和selected兩個屬性表示。

關(guān)于Cell

相對于UITableViewCell來說,UICollectionViewCell沒有這么多花頭。首先UICollectionViewCell不存在各式各樣的默認(rèn)的style,這主要是由于展示對象的性質(zhì)決定的,因為UICollectionView所用來展示的對象相比UITableView來說要來得靈活,大部分情況下更偏向于圖像而非文字,因此需求將會千奇百怪。因此SDK提供給我們的默認(rèn)的UICollectionViewCell結(jié)構(gòu)上相對比較簡單,由下至上:

1、cell本身最為容器的view

2、一個大小自適應(yīng)整個cell的backgroundview,cell的背景

3、其上是selectedBackgroundView,是cell被選中時的背景

4、contentView 自定義內(nèi)容加在這個view上

選中cell的自動變化,所有的cell中的子view,也包括contentView中的子view,在當(dāng)cell被選中時,會自動去查找view是否有被選中狀態(tài)下的改變。比如在contentView里加了一個normal和selected指定了不同圖片的imageView,那么選中這個cell的同時這張圖片也會從normal變成selected,而不需要額外的任何代碼。

UICollectionViewLayout

終于到UICollectionView的精髓了…這也是UICollectionView和UITableView最大的不同。UICollectionViewLayout可以說是UICollectionView的大腦和中樞,它負責(zé)了將各個cell、Supplementary View和Decoration Views進行組織,為它們設(shè)定各自的屬性,包括但不限于:

位置

尺寸

透明度

層級關(guān)系

形狀

等...

Layout決定了UICollectionView是如何顯示在界面上的。在展示之前,一般需要生成合適的UICollectionViewLayout子類對象,并將其賦予CollectionView的collectionViewLayout屬性。

Apple為我們提供了一個最簡單可能也是最常用的默認(rèn)layout對象,UICollectionViewFlowLayout。Flow Layout簡單說是一個直線對齊的layout,最常見的Grid View形式即為一種Flow Layout配置。上面的照片架界面就是一個典型的Flow Layout。

  • 首先一個重要的屬性是itemSize,它定義了每一個item的大小。通過設(shè)定itemSize可以全局地改變所有cell的尺寸,如果想要對某個cell制定尺寸,可以使用-collectionView:layout:sizeForItemAtIndexPath:方法。
  • 間隔 可以指定item之間的間隔和每一行之間的間隔,和size類似,有全局屬性,也可以對每一個item和每一個section做出設(shè)定:
    • @property (CGSize) minimumInteritemSpacing
    • @property (CGSize) minimumLineSpacing
    • -collectionView:layout:minimumInteritemSpacingForSectionAtIndex:
    • -collectionView:layout:minimumLineSpacingForSectionAtIndex:
  • 滾動方向 由屬性scrollDirection確定scroll view的方向,將影響Flow Layout的基本方向和由header及footer確定的section之間的寬度
    • UICollectionViewScrollDirectionVertical
    • UICollectionViewScrollDirectionHorizontal
  • Header和Footer尺寸 同樣地分為全局和部分。需要注意根據(jù)滾動方向不同,header和footer的高和寬中只有一個會起作用。垂直滾動時section間寬度為該尺寸的高,而水平滾動時為寬度起作用,如圖。
    • @property (CGSize) headerReferenceSize
    • @property (CGSize) footerReferenceSize
    • -collectionView:layout:referenceSizeForHeaderInSection:
    • -collectionView:layout:referenceSizeForFooterInSection:
  • 縮進
    • @property UIEdgeInsets sectionInset;
    • -collectionView:layout:insetForSectionAtIndex:

總結(jié)

一個UICollectionView的實現(xiàn)包括兩個必要部分:UICollectionViewDataSource和UICollectionViewLayout,和一個交互部分:UICollectionViewDelegate。而Apple給出的UICollectionViewFlowLayout已經(jīng)是一個很強力的layout方案了。

幾個自定義的Layout

但是光是UICollectionViewFlowLayout的話,顯然是不夠用的,而且如果單單是這樣的話,就和現(xiàn)有的開源各類Grid View沒有區(qū)別了…UICollectionView的強大之處,就在于各種layout的自定義實現(xiàn),以及它們之間的切換。先看幾個相當(dāng)exiciting的例子吧~

比如,堆疊布局:圓形布局:和Cover Flow布局:

所有這些布局都采用了同樣的數(shù)據(jù)源和委托方法,因此完全實現(xiàn)了model和view的解耦。但是如果僅這樣,那開源社區(qū)也已經(jīng)有很多相應(yīng)的解決方案了。Apple的強大和開源社區(qū)不能比擬的地方在于對SDK的全局掌控,CollectionView提供了非常簡單的API可以令開發(fā)者只需要一次簡單調(diào)用,就可以使用CoreAnimation在不同的layout之間進行動畫切換,這種切換必定將大幅增加用戶體驗,代價只是幾十行代碼就能完成的布局實現(xiàn),以及簡單的一句API調(diào)用,不得不說現(xiàn)在所有的開源代碼與之相比,都是相形見拙了…不得不佩服和感謝UIKit團隊的努力。

?

轉(zhuǎn)載于:https://www.cnblogs.com/heri/p/4405337.html

總結(jié)

以上是生活随笔為你收集整理的UICollectionView的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。