iOS

UICollectionReusableView与UITableViewHeaderFooterView的用法

UICollectionReusableView与UITableView的区头

Posted by lingjye on October 25, 2015

UICollectionReusableView与UITableViewHeaderFooterView都继承自UIView, 显示效果类似常见的UITableView Group分组区头区尾

How to use?

UICollectionReusableView用法

创建一个继承UICollectionReusableView的MyCollectionReusableView

1
2
3
4
5
6
7
8
9
//MyCollectionReusableView.h

#import <UIKit/UIKit.h>
 
@interface MyCollectionReusableView : UICollectionReusableView

@property (nonatomic, copy) NSString *labelText;

@end
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
//MyCollectionReusableView.m

#import "MyCollectionReusableView.h"

@interface MyCollectionReusableView()

@property (nonatomic, strong) UILabel *textLabel;

@end

@implementation MyCollectionReusableView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self configSubviews];
    }
    return self;
}
 
- (void)configSubviews {
	[self addSubview:self.textLabel];
}

- (void) setLabelText:(NSString *)labelText {
    self.label.text = text;
}

- (UILabel *)textLabel {
    if (!_textLabel) {
        _textLabel = [[UILabel alloc] init];
    }
    return _textLabel;
}
 
@end

UICollectionReusableView 同 UICollectionViewCell 一样需要提前注册:

1
2
3
[self.collectionView registerClass:[MyCollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"MyCollectionReusableViewHeaderID"];
[self.collectionView registerClass:[MyCollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"MyCollectionReusableViewFooterID"];

然后实现UICollectionViewDataSource协议方法:

1
2
3
4
5
6
7
8
9
10
-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{
    if (kind == UICollectionElementKindSectionHeader) {
        MyCollectionReusableView *reusableHeaderView = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"MyCollectionReusableViewHeaderID" forIndexPath:indexPath];
        reusableHeaderView.labelText = [NSString stringWithFormat:@"%tu", indexPath.section];
        return reusableHeaderView;
    }
    MyCollectionReusableView *reusableFooterView = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"MyCollectionReusableViewFooterID" forIndexPath:indexPath];
    reusableFooterView.labelText = [NSString stringWithFormat:@"%tu", indexPath.section];
    return reusableFooterView;
}

最终效果:

UITableViewHeaderFooterView用法

创建一个继承UITableViewHeaderFooterView的MyTableViewHeaderFooterView

1
2
3
4
5
6
7
8
9
//MyTableViewHeaderFooterView.h

#import <UIKit/UIKit.h>
 
@interface MyTableViewHeaderFooterView : UITableViewHeaderFooterView

@property (nonatomic, copy) NSString *labelText;

@end
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
//MyTableViewHeaderFooterView.m

#import "MyTableViewHeaderFooterView.h"

@interface MyTableViewHeaderFooterView()

@property (nonatomic, strong) UILabel *textLabel;

@end

@implementation MyTableViewHeaderFooterView

- (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithReuseIdentifier:reuseIdentifier]) {
        [self configSubviews];
    }
    return self;
}
 
- (void)configSubviews {
    [self addSubview:self.textLabel];
}

- (void) setLabelText:(NSString *)labelText {
    self.label.text = text;
}

- (UILabel *)textLabel {
    if (!_textLabel) {
        _textLabel = [[UILabel alloc] init];
    }
    return _textLabel;
}
 
@end

注意UITableViewHeaderFooterView的初始化方法为:

1
- (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier;

UITableViewHeaderFooterView 同样也需要提前注册:

1
[self.tableView registerClass:[MyTableViewHeaderFooterView class] forHeaderFooterViewReuseIdentifier:@"MyTableViewHeaderFooterViewID"];

然后实现UITableViewDataSource协议方法:

1
2
3
4
5
6
7
8
9
10
11
12
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    MyTableViewHeaderFooterView *headerView = [MyTableViewHeaderFooterView dequeueReusableHeaderFooterViewWithIdentifier:@"MyTableViewHeaderFooterViewID"];
    headerView.labelText = [NSString stringWithFormat:@"%tu", indexPath.section];
    return headerView;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    MyTableViewHeaderFooterView *footerView = [MyTableViewHeaderFooterView dequeueReusableHeaderFooterViewWithIdentifier:@"MyTableViewHeaderFooterViewID"];
    footerView.labelText = [NSString stringWithFormat:@"%tu", indexPath.section];
    return footerView;
}

效果参考UICollectionReusableView