iOS-UICollectionViewController 介紹

来源:http://www.cnblogs.com/nxz-diy/archive/2016/03/04/5241808.html
-Advertisement-
Play Games

廢話不多說,列幾個列子 (幾種情況下的做法): 情景一: 介紹:1. 在UIViewController 上加 UICollectionView (用代碼 創建 UICollectionView)。 2. UICollectionView上的cell為自定義的view,名字叫:MyDealCell,


廢話不多說,列幾個列子 (幾種情況下的做法):

 

情景一:

介紹:1. 在UIViewController 上加 UICollectionView (用代碼 創建 UICollectionView)。

   2. UICollectionView上的cell為自定義的view,名字叫:MyDealCell,用的是 xib。 ( 新建類 MyDealCell 繼承自 UICollectionViewCell )

   3. 選中 MyDealCell.xib 修改其 identifier 為 ListCell。

   4. 註冊 cell 用 registerClass 。

     5. 在iPad上測試。

 

=======GoodListViewController.h=======

@interface GoodListViewController : UIViewController<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout>

@end

 

=======GoodListViewController.m=======

 

static NSString * const reuseIdentifier = @"ListCell";

- (void)viewDidLoad {
    [super viewDidLoad];

    UICollectionViewFlowLayout *flowLayout=[[UICollectionViewFlowLayout alloc] init];
    flowLayout.scrollDirection=UICollectionViewScrollDirectionVertical;
    collection=[[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:flowLayout];
    collection.dataSource=self;
    collection.delegate=self;
    collection.backgroundColor=[UIColor redColor];
    [self.view addSubview:collection];

    // [self.collectionView registerNib:[UINib nibWithNibName:@"MyDealCell" bundle:nil] forCellWithReuseIdentifier:reuseIdentifier]; // MyDealCell用Xib實現的
    [collection registerClass:[GoodListCell class] forCellWithReuseIdentifier:reuseIdentifier]; // GoodListCell 裡面的控制項既可以用代碼實現,也可以用xib,用xib的話,在 GoodListCell 裡面要通過 GoodListCell *goodsView = [[NSBundle mainBundle] loadNibNamed:@"CollectionCell" owner:self options:nil][0]; 載入xib。
}


-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 23;
}

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

  // 在 [collection dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];中的 collection 和 上面 形參 collectionView 一樣
    MyDealCell *cell=[collection dequeueReusableCellWithReuseIdentifier:reuseIdentifier  forIndexPath:indexPath];
    cell.backgroundColor = [UIColor yellowColor];
    return cell;
}

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    return CGSizeMake(Screen_Width/3-10, Screen_Height-104);
}

-(UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
    return UIEdgeInsetsMake(20, 7.5, 20, 7.5);
}

-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section
{
    return 7.5;
}

-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section
{
    return 20;
}

 

情景二:

介紹:1. GoodListViewController 繼承自 UICollectionViewController

   2. UICollectionView上的cell為自定義的view,名字叫:MyDealCell,用的是 xib。( 新建類 MyDealCell 繼承自 UICollectionViewCell )

   3. 選中 MyDealCell.xib 修改其 identifier 為 ListCell。

   4. 註冊cell用 registerNib

   5. 例子是在iPad上運行調試。

 

=======GoodListViewController.h=======

@interface GoodListViewController : UICollectionViewController

@end

 

static NSString * const reuseIdentifier = @"ListCell";


- (instancetype)init
{
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
    // cell的大小
    layout.itemSize = CGSizeMake(305, 305);
    return [self initWithCollectionViewLayout:layout];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    self.collectionView.backgroundColor = [UIColor redColor];
  
    // Register cell classes
    [self.collectionView registerNib:[UINib nibWithNibName:@"MTDealCell" bundle:nil] forCellWithReuseIdentifier:reuseIdentifier];
    self.collectionView.alwaysBounceVertical = YES;
    
 //   // 添加上拉載入
 //   [self.collectionView addFooterWithTarget:self action:@selector(loadMoreDeals)];
}


/**
 當屏幕旋轉,控制器view的尺寸發生改變調用
 */
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    // 根據屏幕寬度決定列數
    int cols = (size.width == 1024) ? 3 : 2;
    
    // 根據列數計算內邊距
    UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout;
    CGFloat inset = (size.width - cols * layout.itemSize.width) / (cols + 1);
    layout.sectionInset = UIEdgeInsetsMake(inset, inset, inset, inset);
    
    // 設置每一行之間的間距
    layout.minimumLineSpacing = 50;
}

#pragma mark <UICollectionViewDataSource>
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    // 計算一遍內邊距
    [self viewWillTransitionToSize:CGSizeMake(collectionView.width, 0) withTransitionCoordinator:nil];
  
    return 30;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    MTDealCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
    
     GoodListCell *cell=[collection dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
       cell.backgroundColor = [UIColor yellowColor];
       return cell;
}

#pragma mark <UICollectionViewDelegate>
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
  NSLog(@"=====selected=indexPath.item", indexPath.item);
}

 

 

情景三:

介紹:1. ViewController 繼承自 UIViewController

     2. 在ViewController 控制器對應的故事版中直接拉一個 UICollectionView 控制項。然後連線到控制器。

   3. UICollectionView上的cell為自定義的view,名字叫:CollectionCell,用的是 xib。( 新建類 CollectionCell 繼承自 UICollectionViewCell )

     4. 選中剛剛新建的xib,更改類名為 CollectionCell

   5. 控制器中註冊cell用 registerClass

   6. 例子在iphone上運行。

   6. 這個和上兩中情景不一樣的地方是:在控制器中用 registerClass,載入 CollectionCell 對應的 xib 的時候,是在 CollectionCell.m 中通過:

       NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"CollectionCell" owner:self options:nil];載入的。

 

     上面的情景一:在控制器中用 registerClass 的時候,cell裡面的控制項是用代碼實現的;

   上面的情景二:在控制器中用 registerNib 的時候,   cell裡面的控制項是在xib中實現的。

  

 

一、自定義Cell

 

1、新建類CollectionCell繼承自UICollectionViewCell

2、新建Xib,命名為CollectionCell.xib

  a.選中CollectionCell.xib刪掉預設的View,從控制項中拖一個Collection View Cell(圖3)到畫布中,設置大小為95*116

  b.選中剛剛新建的xib,更改類名為CollectionCell

  c.在CollectionCell.xib的CollectionCell中添加一個Label, 然後連線。

 

==========CollectionCell.m , 重寫 initWithFrame 方法 =============

- (id) initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        // 初始化時載入collectionCell.xib文件
        NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"CollectionCell" owner:self options:nil];
        
        // 如果路徑不存在,return nil
        if (arrayOfViews.count < 1)
        {
            return nil;
        }
        // 如果xib中view不屬於UICollectionViewCell類,return nil
        if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]])
        {
            return nil;
        }
        // 載入nib
        self = [arrayOfViews objectAtIndex:0];
    }
    return self;
}

 

二、定義UICollectionView;

1、拖動一個Collection View到指定 ViewController控制器 的View上

2、連線dataSource和delegate,並創建映射(連線),命名 (在控制器中用這個屬性) 為CollectionView

3、選中CollectionView的標尺,將Cell Size的Width和Height改成與自定義的Cell一樣的95*116,

4、選中CollectionView的屬性,可以修改其屬性,比如是垂直滑動,還是水平滑動,選擇Vertical或Horizontal

5、選中CollectionViewCell,修改Class,繼承自CollectionCell。

 

=======ViewController.h=======

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController


@end

 

=======ViewController.m=======

#import "ViewController.h"
#import "CollectionCell.h"

@interface ViewController () <UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout>

@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;  // 通過連線創建的屬性


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor lightGrayColor];
    
    self.collectionView.backgroundColor = [UIColor grayColor];
    [self.collectionView registerClass:[CollectionCell class] forCellWithReuseIdentifier:@"CollectionCell"];
    self.collectionView.delegate = self;
    self.collectionView.dataSource = self;

}

//每個section的item個數
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 40;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
//    CollectionCell *cell = (CollectionCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionCell" forIndexPath:indexPath];
//    
//    //圖片名稱
//    NSString *imageToLoad = [NSString stringWithFormat:@"%d.png", indexPath.row];
//    //載入圖片
//    cell.imageView.image = [UIImage imageNamed:imageToLoad];
//    //設置label文字
//    cell.label.text = [NSString stringWithFormat:@"{%ld,%ld}",(long)indexPath.row,(long)indexPath.section];
    
   CollectionCell *cell = (CollectionCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionCell"forIndexPath:indexPath];
    
    return cell;
}

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"===indexPath.item=%d", (int)indexPath.item);
}

 


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

-Advertisement-
Play Games
更多相關文章
  • 原文出處: codingZero 歡迎分享原創到伯樂頭條 導語 不會使用block的iOS程式員,不是一個合格的程式員學會了block,你再也不想用繁瑣的代理block沒有你想象中的那麼難,不要害怕,不要畏懼,勇敢嘗試筆者入行iOS時已經是ARC的天下,所以這裡只說ARC環境下的使用 什麼是bloc
  • Android Studio 優秀插件系列: Android Studio 優秀插件(一):GsonFormat Android Studio 優秀插件(二): Parcelable Code Generator -------------------------------------------
  • 自己的學習筆記。
  • 一般比較短小的音樂(如游戲中的打鬥、按鍵音效等)則要通過playEffect來播放。
  • 問題 大家都知道,在iOS里的AlertView不會阻塞後續代碼的執行,但如果有時候需要這樣做該怎麼辦呢? 解決方案 通過回調 也就是把後續要執行的代碼放到回調函數中去,可以參見 "UIAlertView Blocks" ,我今天要重點說明的是下麵這種方式。 使用RunLoop 我們都主線程上的Ru
  • 一、概述 隨著Android 6.0發佈以及普及,我們開發者所要應對的主要就是新版本SDK帶來的一些變化,首先關註的就是許可權機制的變化。對於6.0的幾個主要的變化,查看查看官網的這篇文章http://developer.android.com/intl/zh-cn/about/versions/ma
  • 創建你的第一個iOS框架 如果你曾經試圖去創建一個自己的iOS框架的話,你應該知道這件事並不是那些畏懼困難的人能夠成功完成的-畢竟管理依賴和編寫測試並不容易。這篇文章將從開始到最終完成一步步的進行講解,以便你掌握後可以更好的創建自己的框架。 在教程中我們會構建一個框架,框架裡面會暴露一個名為RGBU
  • 一個框架其實就是一個軟體包,它包含了多個類。Mac 操作系統提供了幾十個框架,主要幫助開發者快速的在Mac 系統上開發應用程式。其中包括一些基礎框架,就是為所有程式開發提供基礎的框架,其中幾個常用的類包括:字元串(NSString), 數字(NSNumber), 數組 (NSArray),字典 (N
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...