【问题标题】:Creating a UICollectionView programmatically以编程方式创建 UICollectionView
【发布时间】:2013-07-25 05:31:28
【问题描述】:

我正在寻找一个指南或教程,它将向我展示如何仅使用代码设置一个简单的 UICollectionView。

我正在浏览the documentation on Apples site,我也在使用the reference manual

但是我真的会从一个简单的指南中受益,该指南可以向我展示如何设置 UICollectionView 而无需使用 Storyboard 或 XIB/NIB 文件 - 但不幸的是,当我搜索时,我能找到的只是包含 Storyboard 的教程.

【问题讨论】:

  • 在文档中有一个你应该使用的初始化器,而不是任何超类初始化器,你到底哪里有问题?
  • 真的吗?我已经到了“配置单元格和补充视图”部分——我是不是很笨,错过了这条线?还是我还没达到?
  • 第一个任务是Initializing a Collection View,你是从那里使用初始化器吗?
  • 是的,但这本身是不够的。我还需要设置数据源,否则应用程序崩溃。
  • @Jimmery 现在如何在这个collectionview的单元格中添加图像?

标签: ios objective-c cocoa-touch uicollectionview


【解决方案1】:

头文件:--

@interface ViewController : UIViewController<UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
{
    UICollectionView *_collectionView;
}

实现文件:--

- (void)viewDidLoad
{
     [super viewDidLoad];
     self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

     UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];
    _collectionView=[[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:layout];
    [_collectionView setDataSource:self];
    [_collectionView setDelegate:self];

    [_collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
    [_collectionView setBackgroundColor:[UIColor redColor]];

    [self.view addSubview:_collectionView];


    // Do any additional setup after loading the view, typically from a nib.
}

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

// The cell that is returned must be retrieved from a call to -dequeueReusableCellWithReuseIdentifier:forIndexPath:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath];

    cell.backgroundColor=[UIColor greenColor];
    return cell;
}

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

输出---

【讨论】:

  • 您应该将集合视图添加为IOS7中的属性@property (strong, nonatomic) UICollectionView *collectionView;
  • 设置应该在 -(void)loadView 中进行,而不是在 viewDidLoad 中。至于它为什么起作用,控制器首先在其super.xml中加载默认视图。最好重载 loadview 并直接分配您的自定义视图。
  • 另外,如果您以编程方式将任何子视图添加到 UICollectionViewCell,您真的不想注册 UICollectionViewCell,而是想要子类化它,请配置initWithFrame 方法中的单元格,然后使用单元格标识符注册此子类,而不是 UICollectionViewCell
  • 上面的代码有没有其他人出错?它在_collectionView=[[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:layout]; 行上给了我EXC_BAD_ACCESS 错误
  • 'self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];'这不见了。
【解决方案2】:

对于 swift4 用户:--

class TwoViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UICollectionViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: flowLayout)
        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "collectionCell")
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.backgroundColor = UIColor.cyan
        self.view.addSubview(collectionView)
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 20
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
       var cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath as IndexPath)

       cell.backgroundColor = UIColor.green
       return cell
    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
        return CGSize(width: 50, height: 50)
    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets {
        return UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
    }
}

【讨论】:

  • 现在如何以编程方式在这个 collectionView 中添加图像?
  • @ArgaPK 在 cellForItem 方法中将子视图添加到单元格
【解决方案3】:

对于 Swift 2.0

而不是实现绘制CollectionViewCells所需的方法:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
    {
        return CGSizeMake(50, 50);
    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets
    {
        return UIEdgeInsetsMake(5, 5, 5, 5); //top,left,bottom,right
    }

使用UICollectionViewFlowLayout

func createCollectionView() {
    let flowLayout = UICollectionViewFlowLayout()

    // Now setup the flowLayout required for drawing the cells
    let space = 5.0 as CGFloat

    // Set view cell size
    flowLayout.itemSize = CGSizeMake(50, 50)

    // Set left and right margins
    flowLayout.minimumInteritemSpacing = space

    // Set top and bottom margins
    flowLayout.minimumLineSpacing = space

    // Finally create the CollectionView
    let collectionView = UICollectionView(frame: CGRectMake(10, 10, 300, 400), collectionViewLayout: flowLayout)

    // Then setup delegates, background color etc.
    collectionView?.dataSource = self
    collectionView?.delegate = self
    collectionView?.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cellID")
    collectionView?.backgroundColor = UIColor.whiteColor()
    self.view.addSubview(collectionView!)
}

然后根据需要实现UICollectionViewDataSource方法:

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 20;
    }
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    var cell:UICollectionViewCell=collectionView.dequeueReusableCellWithReuseIdentifier("collectionCell", forIndexPath: indexPath) as UICollectionViewCell;
    cell.backgroundColor = UIColor.greenColor();
    return cell;
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

【讨论】:

    【解决方案4】:

    斯威夫特 3

    class TwoViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UICollectionViewDelegate {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let flowLayout = UICollectionViewFlowLayout()
    
            let collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: flowLayout)
            collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "collectionCell")
            collectionView.delegate = self
            collectionView.dataSource = self
            collectionView.backgroundColor = UIColor.cyan
    
            self.view.addSubview(collectionView)
        }
    
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
        {
            return 20
        }
    
        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
        {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath as IndexPath)
    
            cell.backgroundColor = UIColor.green
            return cell
        }
    
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
        {
            return CGSize(width: 50, height: 50)
        }
    
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets
        {
            return UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
        }
    
    }
    

    【讨论】:

    • @ArgaPK 当然,只需在实例化 flowLayout 后添加 flowLayout.scrollDirection = .horizo​​ntal :)
    【解决方案5】:

    您可以在 uicollection 视图中处理自定义单元格,请参见下面的代码。

    - (void)viewDidLoad
    {
      UINib *nib2 = [UINib nibWithNibName:@"YourCustomCell" bundle:nil];
        [CollectionVW registerNib:nib2 forCellWithReuseIdentifier:@"YourCustomCell"];
    
    
        UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
        [flowLayout setItemSize:CGSizeMake(200, 230)];
        flowLayout.minimumInteritemSpacing = 0;
        [flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];
        [CollectionVW setCollectionViewLayout:flowLayout];
    
        [CollectionVW reloadData];
    }
    
    #pragma mark - COLLECTIONVIEW
    #pragma mark Collection View CODE
    
    -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
    {
        return 1;
    }
    
    - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
    {
        return Array.count;
    }
    
    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *cellIdentifier = @"YourCustomCell";
        YourCustomCell *cell = (YourCustomCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
    
        cell.MainIMG.image=[UIImage imageNamed:[Array objectAtIndex:indexPath.row]];
    
    
        return cell;
    }
    
    -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
    {
    }
    
    #pragma mark Collection view layout things
    // Layout: Set cell size
    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        CGSize mElementSize;
        mElementSize=CGSizeMake(kScreenWidth/3.4, 150);
        return mElementSize;
    }
    
    
    - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section
    {
        return 5.0;
    }
    
    // Layout: Set Edges
    - (UIEdgeInsets)collectionView: (UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
    {
        if (isIphone5 || isiPhone4)
        {
            return UIEdgeInsetsMake(15,15,5,15);  // top, left, bottom, right
        }
        else if (isIphone6)
        {
            return UIEdgeInsetsMake(15,15,5,15);  // top, left, bottom, right
        }
        else if (isIphone6P)
        {
            return UIEdgeInsetsMake(15,15,5,15);  // top, left, bottom, right
        }
    
        return UIEdgeInsetsMake(15,15,5,15);  // top, left, bottom, right
    }
    

    【讨论】:

      【解决方案6】:
      1. 根据@Warewolf 的回答,下一步是创建您自己的自定义单元格。

        转到File -&gt; New -&gt; File -&gt; User Interface -&gt; Empty -&gt; Call这个笔尖"customNib"

      2. 在您的customNib 中拖入一个UICollectionView 单元格。给它重用单元格标识符@"Cell"

      3. File -&gt; New -&gt; File -&gt; Cocoa Touch Class -&gt; Class 命名为"CustomCollectionViewCell" 子类,如果UICollectionViewCell

      4. 回到自定义 nib,单击单元格并创建此自定义类 "CustomCollectionViewCell"

      5. 转到您的 viewDidLoad viewcontroller 而不是

        [_collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cellIdentifier"];

        UINib *nib = [UINib nibWithNibName:@"customNib" bundle:nil]; [_collectionView registerNib:nib forCellWithReuseIdentifier:@"Cell"];

      6. 另外,更改(更改为新的单元格标识符)

        UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];

      【讨论】:

        【解决方案7】:

        苹果文档:

        - (id)initWithFrame:(CGRect)frame 
              collectionViewLayout:(UICollectionViewLayout *)layoutParameters
        

        在初始化集合视图对象时使用此方法 以编程方式。如果您为布局参数指定 nil,您 必须将布局对象分配给 collectionViewLayout 属性 在屏幕上显示集合视图之前。如果您不这样做,则 收藏视图将无法在屏幕上显示任何项目。

        这个方法是指定的初始化器。

        此方法用于初始化UICollectionView。 在这里你提供框架和一个UICollectionViewLayout 对象。

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

        最后,将UICollectionView 作为subview 添加到您的视图中。

        现在以编程方式添加集合视图。你可以继续学习。
        学习愉快!!希望对你有帮助。

        【讨论】:

        • 但我在苹果文档中读到The layout object to use for organizing items. The collection view stores a strong reference to the specified object. Must not be nil.
        【解决方案8】:

        斯威夫特 5

        XCode 11.5

        import UIKit
        
        // 1. When creating this view, instanciate this class with the param "collectionViewLayout: UICollectionViewFlowLayout".
        
        class BespokeCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {
            var cellId = "AwesomeCell"
            
            override func viewDidLoad() {
                super.viewDidLoad()
                
                // 2. Register a reusable cell:
                collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: cellId)
            }
            
            // 3. Return number of items:
            override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
                return 5
            }
            
            // 4. Define the reusable cell:
            override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath)
                // You can cast type above as such: ...for: indexPath) as! BespokeCell
                return cell
            }
            
            // 5. Define the size of the cell. This depends on protocol 'UICollectionViewDelegateFlowLayout' to work:
            func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
                let width = view.frame.width // In this example the width is the same as the whole view.
                let height = CGFloat(200)
                return CGSize(width: width, height: height)
            }
        }
        

        要使用您的定制课程,请不要忘记 collectionViewLayout 参数:

        let layout = UICollectionViewFlowLayout()
        let myViewController = WorkoutViewController(collectionViewLayout: layout)
        

        如果您不使用情节提要,则需要将此视图附加到窗口。那是一个不同的问题。直到 iOS 12 的系统将处理 AppDelegate 文件上的窗口逻辑。在 iOS 13+ 上,此逻辑在 SceneDelegate 文件中处理。

        window?.rootViewController = someController
        

        祝你好运!

        【讨论】:

          【解决方案9】:
              #pragma mark -
              #pragma mark - UICollectionView Datasource and Delegates
          
              -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
              {
                  return 1;
              }
          
              -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
              {
                  return Arr_AllCulturalButtler.count;
              }
          
              -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
              {
                  static NSString *coll=@"FromCulturalbutlerCollectionViewCell";
                  FromCulturalbutlerCollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:coll forIndexPath:indexPath];
                  cell.lbl_categoryname.text=[[Arr_AllCulturalButtler objectAtIndex:indexPath.row] Category_name];
                  cell.lbl_date.text=[[Arr_AllCulturalButtler objectAtIndex:indexPath.row] event_Start_date];
                  cell.lbl_location.text=[[Arr_AllCulturalButtler objectAtIndex:indexPath.row] Location_name];
                  [cell.Img_Event setImageWithURL:[APPDELEGATE getURLForMediumSizeImage:[(EventObj *)[Arr_AllCulturalButtler objectAtIndex:indexPath.row] Event_image_name]] placeholderImage:nil usingActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
                  cell.button_Bookmark.selected=[[Arr_AllCulturalButtler objectAtIndex:indexPath.row] Event_is_bookmarked];
                  [cell.button_Bookmark addTarget:self action:@selector(btn_bookmarkClicked:) forControlEvents:UIControlEventTouchUpInside];
                  cell.button_Bookmark.tag=indexPath.row;
          
          
                  return cell;
              }
              - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
              {
          
                  [self performSegueWithIdentifier:SEGUE_CULTURALBUTLER_KULTURELLIS_DETAIL sender:self];
              }
          
          // stroy board navigation
          - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
          {
              if ([segue.identifier isEqualToString:@"Overview_Register"])
              {
                  WDRegisterViewController *obj=(WDRegisterViewController *)[segue destinationViewController];
                  obj.str_Title=@"Edit Profile";
                  obj.isRegister=NO;
              }
          }
          
                      [self performSegueWithIdentifier:@"Overview_Measure" sender:nil];
          
          
          
              UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
              WDPeekViewController *Peek = (WDPeekViewController *)[sb instantiateViewControllerWithIdentifier:@"WDPeekViewController"];
           [self.navigationController pushViewController:tabBarController animated:YES];
          

          【讨论】:

            【解决方案10】:

            集合视图考试

                #import "CollectionViewController.h"
            #import "BuyViewController.h"
            #import "CollectionViewCell.h"
            
            @interface CollectionViewController ()
            {
                NSArray *mobiles;
                NSArray  *costumes;
                NSArray *shoes;
                NSInteger selectpath;
                NSArray *mobilerate;
                NSArray *costumerate;
                NSArray *shoerate;
            }
            @end
            
            @implementation CollectionViewController
            
            - (void)viewDidLoad
            {
                [super viewDidLoad];
                self.title = self.receivename;
                mobiles = [[NSArray alloc]initWithObjects:@"7.jpg",@"6.jpg",@"5.jpg", nil];
                costumes = [[NSArray alloc]initWithObjects:@"shirt.jpg",@"costume2.jpg",@"costume1.jpg", nil];
                shoes = [[NSArray alloc]initWithObjects:@"shoe.jpg",@"shoe1.jpg",@"shoe2.jpg", nil];
                mobilerate = [[NSArray alloc]initWithObjects:@"10000",@"11000",@"13000",nil];
                costumerate = [[NSArray alloc]initWithObjects:@"699",@"999",@"899", nil];
                shoerate = [[NSArray alloc]initWithObjects:@"599",@"499",@"300", nil];
            }
            - (void)didReceiveMemoryWarning
            {
                [super didReceiveMemoryWarning];
            }
            
            -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
            {
                return 1;
            }
            -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
            {
                return 3;
            }
            -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
            {
                static NSString *cellId = @"cell";
                UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath];
            
                UIImageView *collectionImg = (UIImageView *)[cell viewWithTag:100];
            
                if ([self.receivename isEqualToString:@"Mobiles"])
                {
                    collectionImg.image = [UIImage imageNamed:[mobiles objectAtIndex:indexPath.row]];
                }
                else if ([self.receivename isEqualToString:@"Costumes"])
                {
                    collectionImg.image = [UIImage imageNamed:[costumes objectAtIndex:indexPath.row]];
                }
                else
                {
                    collectionImg.image = [UIImage imageNamed:[shoes objectAtIndex:indexPath.row]];
                }
                return cell;
            }
            
            -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
            
            {
                selectpath = indexPath.row;
                [self performSegueWithIdentifier:@"buynow" sender:self];
            }
            
                // In a storyboard-based application, you will often want to do a little
            - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
            {
                if ([segue.identifier isEqualToString:@"buynow"])
                {
                    BuyViewController *obj = segue.destinationViewController;
                    if ([self.receivename isEqualToString:@"Mobiles"])
                    {
                        obj.reciveimg = [mobiles objectAtIndex:selectpath];
                        obj.labelrecive = [mobilerate objectAtIndex:selectpath];
            
                    }
                    else if ([self.receivename isEqualToString:@"Costumes"])
                    {
                        obj.reciveimg = [costumes objectAtIndex:selectpath];
                        obj.labelrecive = [costumerate objectAtIndex:selectpath];
                    }
                    else
                    {
                        obj.reciveimg = [shoes objectAtIndex:selectpath];
                        obj.labelrecive = [shoerate objectAtIndex:selectpath];
                    }
                    //     Get the new view controller using [segue destinationViewController].
                    //     Pass the selected object to the new view controller.
                }
            }
            
            @end
            

            .h 文件

            @interface CollectionViewController :
            UIViewController<UICollectionViewDelegate,UICollectionViewDataSource>
            @property (strong, nonatomic) IBOutlet UICollectionView *collectionView;
            @property (strong,nonatomic) NSString *receiveimg;
            @property (strong,nonatomic) NSString *receivecostume;
            @property (strong,nonatomic)NSString *receivename;
            
            @end
            

            【讨论】:

            【解决方案11】:

            为谁创建自定义单元格

            CustomCell.h

            
            #import <UIKit/UIKit.h>
            
            @interface HeaderCollectionViewCell : UICollectionViewCell
            @property (strong,nonatomic) UIImageView *image;
            @end
            
            
            

            CustomCell.m

            
            #import "HeaderCollectionViewCell.h"
            
            @implementation HeaderCollectionViewCell
            #define IMAGEVIEW_BORDER_LENGTH 5
            
            - (instancetype)initWithFrame:(CGRect)frame
            {
                self = [super initWithFrame:frame];
                if (self) {
                    [self setup];
                }
                return self;
            }
            
            
            -(void)setup{
                _image = [[UIImageView alloc] initWithFrame:(CGRectInset(self.bounds, IMAGEVIEW_BORDER_LENGTH, IMAGEVIEW_BORDER_LENGTH))];
                [self addSubview:_image];
            
            }
            @end
            
            

            UIViewController.h

            
            #import <UIKit/UIKit.h>
            
            
            @interface HomeViewController : UIViewController<UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
            @property (strong,nonatomic) UICollectionView *collectionView;
            
            @end
            
            

            UIViewController.m

            
            #import "HomeViewController.h"
            #import "HomeView.h"
            #import "HeaderCollectionViewCell.h"
            
            @interface HomeViewController ()
            @property (nonatomic) NSString *cellID;
            
            @end
            
            @implementation HomeViewController
            
            
            
            - (void)viewDidLoad {
                [super viewDidLoad];
                self.view.backgroundColor = UIColor.whiteColor;
            
                _cellID = @"id";
            
                UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
                _collectionView = [[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:layout];
            
            
                [_collectionView registerClass:[HeaderCollectionViewCell class] forCellWithReuseIdentifier:_cellID];
            
            
            
                [_collectionView setDataSource:self];
                [_collectionView setDelegate:self];
            
                _collectionView.backgroundColor = UIColor.redColor;
            
            
                [self.view addSubview:_collectionView];
            
            
            
            }
            
            - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
                return 4;
            }
            
            - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
            
                HeaderCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:_cellID forIndexPath:indexPath];
            
                cell.image.image = [UIImage imageNamed:@"premium-icon"];
            
                return cell;
            }
            
            -(UITabBarItem*) tabBarItem{
                return [[UITabBarItem alloc] initWithTitle:@"Início" image:[UIImage imageNamed:@"home-icon"] tag:0];
            }
            
            
            @end
            
            
            
            

            【讨论】:

              【解决方案12】:
              swift 4 code
              
              
              //
              //  ViewController.swift
              //  coolectionView
              //
              
              
              
              
              import UIKit
              
              class ViewController: UIViewController , UICollectionViewDataSource, UICollectionViewDelegate,UICollectionViewDelegateFlowLayout{
                  @IBOutlet weak var collectionView: UICollectionView!
              
                  var items = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48"]
              
                  override func viewDidLoad() {
                      super.viewDidLoad()
                      // Do any additional setup after loading the view, typically from a nib.
                  }
              
                  override func didReceiveMemoryWarning() {
                      super.didReceiveMemoryWarning()
                      // Dispose of any resources that can be recreated.
                  }
              
                  func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
                      return self.items.count
                  }
                  func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
                  {
                      if indexPath.row % 3 != 0
                      {
                      return CGSize(width:collectionView.frame.width/2 - 7.5 , height: 100)
                      }
                      else
                      {
                          return CGSize(width:collectionView.frame.width - 10 , height: 100 )
                      }
                  }
              
              
                  // make a cell for each cell index path
                  func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
              
                      // get a reference to our storyboard cell
                      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell1234", for: indexPath as IndexPath) as! CollectionViewCell1234
              
                      // Use the outlet in our custom class to get a reference to the UILabel in the cell
                      cell.lbl1.text = self.items[indexPath.item]
                      cell.backgroundColor = UIColor.cyan // make cell more visible in our example project
                      cell.layer.borderColor = UIColor.black.cgColor
                      cell.layer.borderWidth = 1
                      cell.layer.cornerRadius = 8
              
                      return cell
                  }
                  func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                      // handle tap events
                      print("You selected cell #\(indexPath.item)!")
                  }
              
              
              
              }
              

              【讨论】:

              • 如何将此视图控制器绑定为集合视图布局的委托?
              猜你喜欢
              • 1970-01-01
              • 2016-02-19
              • 2023-04-01
              • 1970-01-01
              • 2022-10-31
              • 2017-08-22
              • 2014-05-15
              • 2016-01-25
              相关资源
              最近更新 更多