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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UICollectionView详解

發布時間:2024/9/30 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UICollectionView详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是UICollectionView

UICollectionView是一種新的數據展示方式,簡單來說可以把他理解成多列的UITableView(請一定注意這是UICollectionView的最最簡單的形式)。如果你用過iBooks的話,可能你還對書架布局有一定印象:一個虛擬書架上放著你下載和購買的各類圖書,整齊排列。其實這就是一個UICollectionView的表現形式,或者iPad的iOS6中的原生時鐘應用中的各個時鐘,也是UICollectionView的最簡單的一個布局,如圖:


最簡單的UICollectionView就是一個GridView,可以以多列的方式將數據進行展示。標準的UICollectionView包含三個部分,它們都是UIView的子類:

  • Cells 用于展示內容的主體,對于不同的cell可以指定不同尺寸和不同的內容,這個稍后再說
  • Supplementary Views 追加視圖 如果你對UITableView比較熟悉的話,可以理解為每個Section的Header或者Footer,用來標記每個section的view
  • Decoration Views 裝飾視圖 這是每個section的背景,比如iBooks中的書架就是這個


不管一個UICollectionView的布局如何變化,這三個部件都是存在的。再次說明,復雜的UICollectionView絕不止上面的幾幅圖,關于較復雜的布局和相應的特性,我會在本文稍后和下一篇筆記中進行一些深入。


實現一個簡單的UICollectionView

先從最簡單的開始,UITableView是iOS開發中的非常非常非常重要的一個類,相信如果你是開發者的話應該是對這個類非常熟悉了。實現一個UICollectionView和實現一個UITableView基本沒有什么大區別,它們都同樣是datasource和delegate設計模式的:datasource為view提供數據源,告訴view要顯示些什么東西以及如何顯示它們,delegate提供一些樣式的小細節以及用戶交互的相應。因此在本節里會大量對比collection view和table view來進行說明,如果您還不太熟悉table view的話,也是個對照著復習的好機會。

UICollectionViewDataSource

  • section的數量 -numberOfSectionsInCollection:
  • 某個section里有多少個item -collectionView:numberOfItemsInSection:
  • 對于某個位置應該顯示什么樣的cell -collectionView:cellForItemAtIndexPath:

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

  • collectionView:viewForSupplementaryElementOfKind:atIndexPath:

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

關于重用

為了得到高效的View,對于cell的重用是必須的,避免了不斷生成和銷毀對象的操作,這與在UITableView中的情況是一致的。但值得注意的時,在UICollectionView中,不僅cell可以重用,Supplementary View和Decoration View也是可以并且應當被重用的。在iOS5中,Apple對UITableView的重用做了簡化,以往要寫類似這樣的代碼:


123456UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MY_CELL_ID"]; if (!cell) //如果沒有可重用的cell,那么生成一個 { ????cell = [[UITableViewCell alloc] init]; } //配置cell,blablabla return cell;

而如果我們在TableView向數據源請求數據之前使用-registerNib:forCellReuseIdentifier:方法為@“MY_CELL_ID”注冊過nib的話,就可以省下每次判斷并初始化cell的代碼,要是在重用隊列里沒有可用的cell的話,runtime將自動幫我們生成并初始化一個可用的cell。

這個特性很受歡迎,因此在UICollectionView中Apple繼承使用了這個特性,并且把其進行了一些擴展。使用以下方法進行注冊:

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

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


1 2 3 4 5 6 -(UICollectionView*)collectionView:(UICollectionView*)cvcellForItemAtIndexPath:(NSIndexPath*)indexPath{ ????MyCell*cell=[cvdequeueReusableCellWithReuseIdentifier:@MY_CELL_ID]; ????// Configure the cell's content ????cell.imageView.image=... ????returncell; }

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

UICollectionViewDelegate

數據無關的view的外形啊,用戶交互啊什么的,由UICollectionViewDelegate來負責:

  • cell的高亮
  • cell的選中狀態
  • 可以支持長按后的菜單

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

  • -collectionView:shouldHighlightItemAtIndexPath: 是否應該高亮?
  • -collectionView:didHighlightItemAtIndexPath: 如果1回答為是,那么高亮
  • -collectionView:shouldSelectItemAtIndexPath: 無論1結果如何,都詢問是否可以被選中?
  • -collectionView:didUnhighlightItemAtIndexPath: 如果1回答為是,那么現在取消高亮
  • -collectionView:didSelectItemAtIndexPath: 如果3回答為是,那么選中cell
  • 狀態控制要比以前靈活一些,對應的高亮和選中狀態分別由highlighted和selected兩個屬性表示。

    關于Cell

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

    • 首先是cell本身作為容器view
    • 然后是一個大小自動適應整個cell的backgroundView,用作cell平時的背景
    • 再其上是selectedBackgroundView,是cell被選中時的背景
    • 最后是一個contentView,自定義內容應被加在這個view上

    這次Apple給我們帶來的好康是被選中cell的自動變化,所有的cell中的子view,也包括contentView中的子view,在當cell被選中時,會自動去查找view是否有被選中狀態下的改變。比如在contentView里加了一個normal和selected指定了不同圖片的imageView,那么選中這個cell的同時這張圖片也會從normal變成selected,而不需要額外的任何代碼。

    UICollectionViewLayout

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

    • 位置
    • 尺寸
    • 透明度
    • 層級關系
    • 形狀
    • 等等等等…

    Layout決定了UICollectionView是如何顯示在界面上的。在展示之前,一般需要生成合適的UICollectionViewLayout子類對象,并將其賦予CollectionView的collectionViewLayout屬性。關于詳細的自定義UICollectionViewLayout和一些細節,我將寫在之后一篇筆記中。

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

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

    總結

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


    幾個自定義的Layout

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

    比如,堆疊布局:


    圓形布局:


    和Cover Flow布局:


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

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日韩成人综合 | 欧美亚洲一二三区 | 久久综合久久鬼色 | 18禁肉肉无遮挡无码网站 | 激情久久五月 | 一级做a爱视频 | www免费视频 | 国产日韩欧美电影 | 91av国产精品 | 国产精品人人人人 | 99久久久 | 国产一区二区三区视频 | 中文字幕人乱码中文字 | 碰碰97 | 成人毛片av| 久久嗨 | 国产高清免费 | 麻豆成人免费视频 | 久久久www免费人成人片 | 热热色av | 色妞干网 | 欧美视频免费 | 真实的国产乱xxxx在线 | 国产精品一区在线观看你懂的 | 国产成a人亚洲精品 | 激情四虎 | 69日本xxxxxxxxx30 在线波多野结衣 | 欧洲av网站| 91在线视频导航 | 欧美熟妇另类久久久久久不卡 | 日韩中文字幕在线观看视频 | 欧美激情在线 | 日本视频网站在线观看 | 中文字幕第80页 | 91一区二区在线 | 欧美激情 在线 | 国产精品久久久久蜜臀 | 国产专区在线 | 中文字幕无码精品亚洲35 | 中文字幕永久在线观看 | 在线观看黄 | 成人图片小说 | 一级少妇女片 | 一本大道久久a久久精二百 琪琪色在线视频 | 少妇一级淫片免费 | 免费精品在线 | 国产精品日本一区二区在线播放 | 亚洲91精品| 国产精品18久久久久久无码 | 欧美 日韩 国产在线 | 久久人人妻人人人人妻性色av | 青青草日韩 | 麻豆影视国产在线观看 | 大战熟女丰满人妻av | 99这里都是精品 | tube日本69第一次 | 91狠狠爱| 欧美精品一区二区视频 | 日本在线不卡一区二区三区 | 怡红院成人网 | 黄色aaa毛片| 999超碰| 2021狠狠干| 欧产日产国产精品98 | 丰满人妻一区二区三区无码av | 初尝人妻少妇中文字幕 | 麻豆视| 观看免费av | 午夜视频网站在线观看 | 黄色av不卡 | 中文在线国产 | 在线观看欧美亚洲 | 日韩在线一卡二卡 | 亚洲蜜臀av乱码久久精品蜜桃 | 韩国jizz| 亚洲色图美腿丝袜 | 精品盗摄一区二区三区 | 九九九九色 | 欧美色啪 | 亚洲AV无码成人精品区东京热 | 久久字幕 | 欧洲丰满少妇做爰 | 久久精品视频一区二区 | 国产吧在线 | 激情播播网 | 欧美激情性生活 | 97精品久久久 | 熟女av一区二区三区 | 免费视频久久久 | 国产欧美视频一区二区三区 | 打屁股av | 一区二区三区有限公司 | 国产精品久久777777 | 欧美乱做爰xxxⅹ久久久 | 午夜伦理在线观看 | wwwxxx黄色片 | 午夜黄色网址 | 艹男人的日日夜夜 | 成人网站免费观看 |