集合视图

集合视图是iOS 6推出的新视图,克服了表视图中一行只能显示一个单元的缺陷。下面来简单看看怎么使用集合视图,一共有5个步骤,如下:

1.自定义单元
2.配置视图控制器
3.内容单元
4.实现流式布局
5.分区标题视图

接下来,看看每一步的操作。

自定义视图

继承UICollectionViewCell,定义自己的属性

ContentCell.h
```objc

import

@interface ContentCell : UICollectionViewCell
@property (strong, nonatomic) UILabel *label;
@property (copy, nonatomic) NSString *text;
+ (CGSize)sizeForContentString:(NSString *)s;
@end
```

ContentCell.m
```objc

import ContentCell.h

@implementation ContentCell

  • (instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
    self.label = [[UILabel alloc] initWithFrame:self.contentView.bounds];
    self.label.opaque = NO;
    self.label.backgroundColor = [UIColor colorWithRed:0.8 green:0.9 blue:1 alpha:1];
    self.label.textColor = [UIColor blackColor];
    self.label.textAlignment = NSTextAlignmentCenter;
    self.label.font = [[self class] defaultFont];
    [self.contentView addSubview:self.label];
    }
    return self;
    }
  • (UIFont *)defaultFont{
    return [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
    }
  • (CGSize)sizeForContentString:(NSString *)s{
    CGSize maxSize = CGSizeMake(300, 1000);
    NSStringDrawingOptions opts = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
    [style setLineBreakMode:NSLineBreakByWordWrapping];

    NSDictionary *attributes = @{ NSFontAttributeName:[self defaultFont],
    NSParagraphStyleAttributeName:style};
    CGRect rect = [s boundingRectWithSize:maxSize options:opts attributes:attributes context:nil];
    return rect.size;
    }

  • (NSString *)text{
    return self.label.text;
    }
  • (void)setText:(NSString *)text{
    self.label.text = text;
    CGRect newLabelFrame = self.label.frame;
    CGRect newContentFrame = self.contentView.frame;
    CGSize textSize = [[self class] sizeForContentString:text];
    newLabelFrame.size = textSize;
    newContentFrame.size = textSize;
    self.label.frame = newLabelFrame;
    self.contentView.frame = newContentFrame;
    }
    @end
    ```

配置视图控制器

这步跟表视图类似,初始化数据,初始化集合视图,注册Cell

- (void)viewDidLoad {
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = NO;
    self.sections =
    @[
      @{ @"header" : @"First Witch",
         @"content" : @"Hey, when will the three of us meet up later?" },
      @{ @"header" : @"Second Witch",
         @"content" : @"When everything's straightened out." },
      @{ @"header" : @"Third Witch",
         @"content" : @"That'll be just before sunset." },
      @{ @"header" : @"First Witch",
         @"content" : @"Where?" },
      @{ @"header" : @"Second Witch",
         @"content" : @"The dirt patch." },
      @{ @"header" : @"Third Witch",
         @"content" : @"I guess we'll see Mac there." },
      ];

    // Register cell classes
    [self.collectionView registerClass:[ContentCell class] forCellWithReuseIdentifier:@"CONTENT"];
    [self.collectionView registerClass:[HeaderCell class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HEADER"];

    // Do any additional setup after loading the view.
    self.collectionView.backgroundColor = [UIColor whiteColor];

    UIEdgeInsets contentInset = self.collectionView.contentInset;
    contentInset.top = 20;
    [self.collectionView setContentInset:contentInset];

    //流式布局时会用到
    UICollectionViewLayout *layout = self.collectionView.collectionViewLayout;
    UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout *)layout;
    flow.sectionInset = UIEdgeInsetsMake(10, 20, 30, 20);

    flow.headerReferenceSize = CGSizeMake(100, 25);
}

内容单元

可以发现,到这一步为止,都跟表视图的操作类似

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return self.sections.count;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    NSArray *words = [self wordsInSection:section];
    return words.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    NSArray *words = [self wordsInSection:indexPath.section];
    ContentCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CONTENT" forIndexPath:indexPath];
    cell.text = words[indexPath.row];
    // Configure the cell

    return cell;
}

实现流式布局

这里定义了每个单元的大小。

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout*)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    NSArray *words = [self wordsInSection:indexPath.section];
    CGSize size = [ContentCell sizeForContentString:words[indexPath.row]];
    return size;
}

以下代码放在viewDidLoad中,用来控制单元之间的距离。

    //流式布局时会用到
    UICollectionViewLayout *layout = self.collectionView.collectionViewLayout;
    UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout *)layout;
    flow.sectionInset = UIEdgeInsetsMake(10, 20, 30, 20);

分区标题视图

我们可以定义集合视图的分区标题视图,实现更多的效果。

首先得定义一个Cell

HeaderCell.m
```objc

import HeaderCell.h

@implementation HeaderCell

  • (instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
    self.label.backgroundColor = [UIColor colorWithRed:0.9 green:0.9 blue:0.8 alpha:1];
    self.label.textColor = [UIColor blackColor];
    }
    return self;
    }
  • (UIFont *)defaultFont{
    return [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
    }

@end
```

再使用以下代码进行设置。

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{
    if ([kind isEqual:UICollectionElementKindSectionHeader]) {
        HeaderCell *cell = [self.collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"HEADER" forIndexPath:indexPath];
        cell.text = self.sections[indexPath.section][@"header"];
        return cell;
    }
    return nil;
}

另外,还需要在初始化时注册cell以及显示指定大小

    //注册headerCell
    [self.collectionView registerClass:[HeaderCell class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HEADER"];

    UICollectionViewLayout *layout = self.collectionView.collectionViewLayout;
    UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout *)layout;
    flow.sectionInset = UIEdgeInsetsMake(10, 20, 30, 20);
    //指定header的大小
    flow.headerReferenceSize = CGSizeMake(100, 25);
时间: 2024-10-12 15:19:30

集合视图的相关文章

集合视图(UICollectionView)

集合视图的四个组成部分: 单元格:它是集合视图中的一个单元格. 节:它是集合视图中的一个行数据,由多个单元格构成 补充视图:它是节的头和脚 装饰视图:集合视图中的背景图. UICollectionView继承自UIScrollView.有两个协议:UICollectionViewDelegate委托协议和UICollectionViewDataSource数据源协议. UICollectionViewCell是单元格类,它的布局是有UICollectionViewLayout类定义的,它是一个抽

集合视图控制器(CollectionViewController) 、 标签控制器(TabBarController) 、 高级控件介绍

  1 创建集合视图,设置相关属性以满足要求 1.1 问题 集合视图控制器UIConllectionViewController是一个展示大量数据的控制器,系统默认管理着一个集合视图UICollectionView,功能几乎和UITableViewController差不多,能够以多行多列的形式展示数据. 集合视图UICollectionView继承至UIScrollView,也同tableView一样有两个协议,分别是UICollectionViewDataSource数据源协议和UIColl

CollectionViewController 集合视图

 CollectionViewController 集合视图     UICollectionView, 继承于UIScollView, 可以滚动, 从iOS6才出现, 和UITableView的用法非常相似     tableView     dataSource: 显示数据     delegate: 样式和触发方法     collectionView     dataSource: 显示数据     delegate: 触发方法     UICollectionViewLayout: 样

iOS基础之CollectionView(集合视图)

在iOS6.0之后,苹果推出了?个新的继承于UIScrolleriew的一个视 图,UICollectionView,也被称之为集合视图.和UITableView共同作为 在开发中常常用的两个视图,常常作为项目的主界面出现. 代码演示: #import "YourCollectionViewCell.h" @implementation YourCollectionViewCell -(instancetype)initWithFrame:(CGRect)frame{ self = [

UICollectionView 集合视图用法,自定义Cell

在View里面 //1.创建UICollectionViewFlowLayout UICollectionViewFlowLayout *flowLayout=[[UICollectionViewFlowLayout alloc] init]; //设置 //1.1设置大小 flowLayout.itemSize=CGSizeMake(90, 90); //1.2设置左右间距(注意如果给定间距,无法满足屏幕的宽度,设置无效) flowLayout.minimumInteritemSpacing=

ios学习记录 day42 UI18 集合视图

集合视图UICollectionView 简单来说就是多列的TableView 它们同样是datasource和delegate设计模式UICollectionViewLayout是一个对View布局和行为描述的类  UICollectionViewFlowLayout是它的子类 ios学习记录 day42 UI18 集合视图,码迷,mamicode.com

第二十一讲.UICollectionView(集合视图)以及瀑布流效果, 通知中心(NSNotificationCenter).

一.集合视图(UICollectionView) 1.集合视图的概念 2.如何创建 3.集合视图的布局UICollectionViewFlowLayout 4.自定义cell和 布局协议UICollectionViewDelegateFlowLayout 使用时cell一般选择自定义,而在布局时候要使用代理. UICollectionView的基本使用示例代码分析: #import "ViewController.h" #import "CollectionReusableV

UICollectionView 集合视图

创建集合视图 UICollectionView * cView = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 0, 320, 568  ) collectionViewLayout:flowLayout];    cView.dataSource = self;  设置 dataSource 代理    cView.delegate = self;      设置delegate 代理    [self.view addSubvie

iOS集合视图单元格高亮和选中的区别

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明. 如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 集合视图(Collection View)拥有一个遵守UICollectionViewDelegate协议的delegate属性.该委托属性将从集合视图接收到各种委托调用