UICollectionView使用以及與UITableView的區別

来源:http://www.cnblogs.com/salam/archive/2016/02/16/5192576.html
-Advertisement-
Play Games

在開始前我們在這先附一段最簡單的代碼 - (void)viewDidLoad { [super viewDidLoad]; UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; UICollec


  在開始前我們在這先附一段最簡單的代碼

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
    
    UICollectionView *colView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:layout];
    colView.backgroundColor = [UIColor grayColor];
    [colView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"myCell"];
    colView.delegate = self;
    colView.dataSource = self;
    
    [self.view addSubview:colView];

}

- (NSArray *)loadData
{
    NSArray *arr = [NSArray arrayWithObjects:@"cell", @"cell2", @"cell3", @"cell4", @"cell5", @"cell6", @"cell7",nil];
    return arr;
}

#pragma mark - UICollectionViewDataSource

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return [[self loadData] count];
}

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"myCell";
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];
    cell.backgroundColor = [UIColor redColor];
    return cell;
}
代碼

 

當你運行時將看到,它與UITableView的佈局區別。

  

一、介紹

  UICollectionView類負責管理數據的有序集合以及以自定義佈局的模式來呈現這些數據,它提供了一些常用的表格(table)功能,此外還增加了許多單欄佈局。UICollectionView支持可以用於實現多列網格、 平鋪的佈局、 圓形的佈局和更多的自定義佈局,甚至你可以動態地改變它的佈局。

當將一個集合視圖添加到您的用戶界面,您的應用程式的主要工作是管理與該集合視圖關聯的數據。集合視圖的數據源對象,是一個對象,符合 UICollectionViewDataSource 協議,提供由您的應用程式數據集合中視圖分成單個的item,然後可以分為節為演示文稿中獲取其數據。item是您想要呈現的數據的最小單位。例如,在照片的應用程式,item可能是一個單一的圖像。集合視圖使用一個cell來呈現item,這是您的數據源配置,並提供 UICollectionViewCell 類的一個實例。

除了將它嵌入在您的用戶界面,您可以使用 UICollectionView 對象的方法以確保item的可視化表示匹配您的數據源對象中的順序。因此,每當您添加、 刪除或重新排列您的集合中的數據,您可以使用此類的方法來插入、 刪除和重新排列相應cell的狀態。您還使用集合視圖對象來管理所選的item。
   二、使用     1.我們要使用UICollectionView得實現UICollectionViewDataSource, UICollectionViewDelegate,UICollectionViewDelegateFlowLayout這三個協議。UICollectionViewDataSource是它的數據源,UICollectionViewDelegate是它的呈現樣式,UICollectionViewDelegateFlowLayout是它的佈局模式  

  2.初始化,在初始化之前我們需要常見佈局實例

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];

 

UICollectionView *colView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:layout];

 

  3.註冊UICollectionView使用的cell類型。

【必須先註冊,否則會報異常

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindCell with identifier myCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

[colView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"myCell"];

  4.設置代理 

    colView.delegate = self;
    colView.dataSource = self;

 

 

  5.實現協議

UICollectionViewDataSource

//配置UICollectionView的每個section的item數
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return [[self loadData] count];
}

 

//配置section數
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

 

//呈現數據
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"myCell";
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];
    cell.backgroundColor = [UIColor redColor];
    return cell;
}

 

UICollectionViewDelegateFlowLayout

//配置每個item的size
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    return CGSizeMake(100, 60);
}

//配置item的邊距
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
    return UIEdgeInsetsMake(20, 20, 0, 20);
}

 

 效果

我們明晰地可以看到,它已經進行自動佈局,為了更能說明問題,我們現在將

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    return CGSizeMake(200, 60);
}

 

 

return CGSizeMake(60, 60);

 

UICollectionViewDelegate

//點擊item時觸發
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"您點擊了item:%@", [[self loadData] objectAtIndex:indexPath.row]);
    [collectionView cellForItemAtIndexPath:indexPath].backgroundColor = [UIColor redColor];
    
}

//當前ite是否可以點擊
- (BOOL) collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(nonnull NSIndexPath *)indexPath
{
    if (indexPath.row % 2)
    {
        return YES;
    }
    
    return NO;
}

 

 

我們也可以通過設置UICollectionViewCell的selectedBackgroundView屬性來改變cell選中時的背景視圖。

我們還可以設置哪些cell點擊時不高亮,點擊時cell的樣式和點擊後cell的樣式

- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

- (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
    cell.backgroundColor = [UIColor redColor];
}

- (void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
    cell.backgroundColor = [UIColor grayColor];
}

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.2、目的通過學習本文檔,能夠對jQuery有一個簡單的認識瞭解,清楚JQuery與其他JS框架的不同,掌握jQuery的常用語法、使用技巧及註意事項。二、使用方法在需要使用JQuery的頁面中引入JQuery的js文件即可。例如:<script type="text/javascript" sr
  • 前言:有時候我們需要獲取文件的MIMEType的信息,下麵就介紹關於獲取MIMEType的方法。 1、直接百度搜索關鍵字"MIMEType",你會找到,然後查吧: 2、用代碼獲取文件的MIMEType信息: 1 #import "GetMIMEType.h" 2 3 #import <MobileC
  • 前言:使用NSURLConnection實現文件上傳有點繁瑣。 本文並沒有介紹使用第三方框架上傳文件。 正文: 這裡先提供用於編碼測試的介面:http://120.25.226.186:32812 點擊進去你會發現到下麵: 最好該鏈接用Google瀏覽器打開,因為Google瀏覽器開啟開發者模式用起
  • Android開發,需要連接webservice,之前就想用谷歌提供的jar包,下載地址:http://pan.baidu.com/s/1hqMTUHe 把它下載下來粘貼到libs文件夾下即可: 網上有很多類似的方法,我嘗試了很多都沒有成功,最後發現是我下載的jar包有問題導致我一直卡在哪兒。 首先
  • 如下是快速索引的效果圖,是從網上下的實例。如圖實現的難點1:是最右側的索引是用自定義View來實現的,主要通過onDraw的方法將其畫出; 難點2:是如何拿到每個名字的首字母用的是pinyin4j-2.5.0.jar 將漢字轉化成拼音再去第一個字元;難點3:ListView的adapte不好實現 下
  • Android的存儲系統(一) 看了很長時間Vold存儲模塊的相關知識,也死扣了一段時間的Android源碼,發現Android存儲系統所涉及的函數調用,以及Kernel與上層之間的Socket傳輸真的是讓人頭疼,除了需要整理整個架構的原理以外,還要反覆看源碼,真真的鬱悶。 鬱悶之餘,還是打算把自己
  • 1.ERROR:--90096 :原因是:啟動圖的問題; 解決 :添加一張名字是 [email protected] 的啟動圖; 2.ERROR:--90535 :原因是:導入的第三方的問題; 解決 :刪除第三方包中的info.plist里的Executable file 這一行;
  • 在開發過程中,經常會需要處理一組不同類型的數據,比如學生的個人信息,由姓名、年齡、性別、身高等組成,因為這些數據是由不同數據類型組成的,因此不能用數組表示,對於不同數據類型的一組數據,可以採用結構體來進行存儲。當然,對於面向對象的語言來說,最好是用類來表示,但是C語言是面向過程的,因此選擇用結構體來
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...