iOS 自定义CollectionView(自定义View的创

2018-05-17  本文已影响36人  隔墙送来秋千影

//TesteCourseView.h

#import <UIKit/UIKit.h>
#import "TasteCourseModel.h"

@interface TesteCourseView : UIView

- (void) setupDataWithTasteCourseModel:(TasteCourseModel *)tasteCourseModel;

@end

// TesteCourseView.m

#import "TesteCourseView.h"
#import "CourseCollectionViewCell.h"

@interface TesteCourseView ()<UICollectionViewDataSource, UICollectionViewDelegate>

@property (nonatomic, strong)UICollectionView *collectionView;
@property (nonatomic, strong)TasteCourseModel *tasteModel;

@end

@implementation TesteCourseView

- (instancetype)init
{
    self = [super init];
    if (self) {
        [self setupView];
    }
    return self;
}

- (UICollectionView *)collectionView
{
    if (!_collectionView) {
        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
        layout.scrollDirection = UICollectionViewScrollDirectionVertical;
        layout.minimumInteritemSpacing = 25/2 *SCALE_WIDTH;
        layout.itemSize = CGSizeMake(SCREEN_WIDTH - 30 *SCALE_WIDTH, 90 *SCALE_WIDTH);
        layout.sectionInset = UIEdgeInsetsMake(0, 15 *SCALE_WIDTH, 0, 15 *SCALE_WIDTH);
        [layout setHeaderReferenceSize:CGSizeMake(0,35 *SCALE_WIDTH)];
        
        _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
        [_collectionView registerClass:[CourseCollectionViewCell class] forCellWithReuseIdentifier:@"CellReuseIdentifier"];
        _collectionView.alwaysBounceVertical = YES;
        [_collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"headerReuseIdentifier"];
        
        _collectionView.showsHorizontalScrollIndicator = NO;
        _collectionView.backgroundColor = BACKGROUND_COLOR;
        _collectionView.dataSource = self;
        _collectionView.delegate = self;
        
    }
    return _collectionView;
}

- (void) setupDataWithTasteCourseModel:(TasteCourseModel *)tasteCourseModel {
    self.tasteModel = tasteCourseModel;
    [self.collectionView reloadData];
}

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{
    
    UICollectionReusableView *reusableView =nil;
    if (kind == UICollectionElementKindSectionHeader) {
        reusableView = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"headerReuseIdentifier" forIndexPath:indexPath];
        [(UIView*)[reusableView.subviews lastObject] removeFromSuperview];
        UILabel *titleLabel = [[UILabel alloc] init];
        titleLabel.text = @"根据学习目标进行推荐";
        titleLabel.textColor = NORMARL_FONT_COLOR;
        titleLabel.font = NORMAL_FONT;
        [reusableView addSubview:titleLabel];
        
        [titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(reusableView.mas_top).offset(5 *SCALE_WIDTH);
            make.left.mas_equalTo(reusableView).and.offset(20 *SCALE_WIDTH);
            make.right.mas_equalTo(reusableView).and.offset(-15 *SCALE_WIDTH);
            make.height.mas_equalTo(reusableView);
        }];
        
    }
    
    return reusableView;
}

#pragma mark - setupViewAndlayoutView
- (void)setupView {
    [self addSubview:self.collectionView];
    [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self);
        make.height.mas_equalTo(self);
        make.left.mas_equalTo(self);
        make.right.mas_equalTo(self);
    }];
}

#pragma mark - UICollectionViewDataSourceAndUICollectionViewViewDelegate
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return self.tasteModel.tasteCourseArr.count;
}

/** cell的内容*/
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    
    CourseCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CellReuseIdentifier" forIndexPath:indexPath];
    [(UIView*)[cell.contentView.subviews lastObject] removeFromSuperview];

    NSDictionary *dic = [self.tasteModel.tasteCourseArr objectAtIndex:indexPath.item];
    CourseModel *model = [CourseModel mj_objectWithKeyValues:dic];
    [cell setupViewWithType:CourseCollectionCellTypeTasteCourse];
    [cell setupDataWithModel:model];
    
    return cell;
}

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    NSDictionary *dic = [self.tasteModel.tasteCourseArr objectAtIndex:indexPath.item];
    CourseModel *model = [CourseModel mj_objectWithKeyValues:dic];
    [kNotificationCenter postNotificationName:PUSH_COLLEGE_COURSR_DETAIL object:@(model.Id)];
}

//自定义CollectionCell的创建
//枚举的创建
//CourseCollectionViewCell.h

#import <UIKit/UIKit.h>
#import "CourseModel.h"
@interface CourseCollectionViewCell : UICollectionViewCell

typedef NS_ENUM(NSUInteger, CourseCollectionCellType) {
    CourseCollectionCellTypeNormal,
    CourseCollectionCellTypeMyCourse,               // 我的课程
    CourseCollectionCellTypeCollect,                     // 收藏的课程
    CourseCollectionCellTypeTasteCourse,          //体验课程
    CourseCollectionCellTypeOrder                        // 课程订单
};

- (void)setupViewWithType:(CourseCollectionCellType)type;
- (void)setupDataWithModel:(CourseModel *)model;

@end

//CourseCollectionViewCell.m

#import "CourseCollectionViewCell.h"

@interface CourseCollectionViewCell ()

@property (nonatomic, strong)UIImageView    *imgView;
@property (nonatomic, strong)UILabel        *titleLabel;
@property (nonatomic, strong)UILabel        *courseHourLabel;
@property (nonatomic, strong)UILabel        *learnStateLabel;
@property (nonatomic, strong)UILabel        *priceLabel;

@property (nonatomic, strong)UIView         *lineView;
@property (nonatomic, strong)UILabel        *orderNumberLabel;
@property (nonatomic, strong)UILabel        *totalPriceLabel;

@property (nonatomic, assign)CourseCollectionCellType type;

@end

@implementation CourseCollectionViewCell

#pragma mark - lazyinit
- (UIImageView *)imgView
{
    if (!_imgView) {
        _imgView = [[UIImageView alloc] init];
        _imgView.backgroundColor = BACKGROUND_COLOR;
    }
    return _imgView;
}

- (UILabel *)titleLabel
{
    if (!_titleLabel) {
        _titleLabel = [[UILabel alloc] init];
        _titleLabel.numberOfLines = 2;
        [_titleLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
        _titleLabel.font = NORMAL_FONT;
        _titleLabel.textColor = DARK_FONT_COLOR;
    }
    return _titleLabel;
}

- (UILabel *)courseHourLabel
{
    if (!_courseHourLabel) {
        _courseHourLabel = [[UILabel alloc] init];
        _courseHourLabel.font = SMALL_FONT;
        _courseHourLabel.textColor = NORMARL_FONT_COLOR;
    }
    return _courseHourLabel;
}

- (UILabel *)learnStateLabel
{
    if (!_learnStateLabel) {
        _learnStateLabel = [[UILabel alloc] init];
        _learnStateLabel.font = NORMAL_FONT;
        _learnStateLabel.textColor = GREEN_COLOR;
        _learnStateLabel.textAlignment = NSTextAlignmentRight;
        _learnStateLabel.text = @"继续学习";
    }
    return _learnStateLabel;
}

- (UILabel *)priceLabel
{
    if (!_priceLabel) {
        _priceLabel = [[UILabel alloc] init];
        _priceLabel.font = NORMAL_FONT;
        _priceLabel.textColor = GREEN_COLOR;
        if (self.type != CourseCollectionCellTypeOrder) {
            _priceLabel.textAlignment = NSTextAlignmentRight;
        }
    }
    return _priceLabel;
}

- (UIView *)lineView
{
    if (!_lineView) {
        _lineView = [[UIView alloc] init];
        _lineView.backgroundColor = BACKGROUND_COLOR;
    }
    return _lineView;
}

- (UILabel *)orderNumberLabel
{
    if (!_orderNumberLabel) {
        _orderNumberLabel = [[UILabel alloc] init];
        _orderNumberLabel.textColor = NORMARL_FONT_COLOR;
        _orderNumberLabel.font = LIGHT_FONT;
    }
    return _orderNumberLabel;
}

- (UILabel *)totalPriceLabel
{
    if (!_totalPriceLabel) {
        _totalPriceLabel = [[UILabel alloc] init];
        _totalPriceLabel.textColor = RGBColor(255,90,93);
        _totalPriceLabel.font = NORMAL_FONT;
        _totalPriceLabel.textAlignment = NSTextAlignmentRight;
    }
    return _totalPriceLabel;
}

#pragma mark - setupViewAndData
- (void)setupViewWithType:(CourseCollectionCellType)type
{
    self.type = type;
    self.backgroundColor = [UIColor whiteColor];
    [self.contentView addSubview:self.imgView];
    [self.contentView addSubview:self.titleLabel];
    [CommonTool addShadowTo:self];
    
    switch (type) {
        case CourseCollectionCellTypeNormal:
            [self.contentView addSubview:self.courseHourLabel];
            break;
        case CourseCollectionCellTypeMyCourse:
            [self.contentView addSubview:self.courseHourLabel];
            [self.contentView addSubview:self.learnStateLabel];
            break;
        case CourseCollectionCellTypeCollect:
            [self.contentView addSubview:self.courseHourLabel];
            [self.contentView addSubview:self.priceLabel];
            break;
        case CourseCollectionCellTypeTasteCourse:
            [self.contentView addSubview:self.courseHourLabel];
            [self.contentView addSubview:self.priceLabel];
            break;
        case CourseCollectionCellTypeOrder:
            [self.contentView addSubview:self.priceLabel];
            [self.contentView addSubview:self.lineView];
            [self.contentView addSubview:self.orderNumberLabel];
            [self.contentView addSubview:self.totalPriceLabel];
            break;
    }
}

- (void)setupDataWithModel:(CourseModel *)model
{
    _titleLabel.text = model.courseName;
    _courseHourLabel.text = [NSString stringWithFormat:@"%ld课时", model.duration];
    [_imgView sd_setImageWithURL:[NSURL URLWithString:model.imageUrl] placeholderImage:nil];
    _orderNumberLabel.text = [CommonTool putTwoStringTogether:@"订单编号:" and:model.tradeNo];

    NSString *priceStr = [NSString stringWithFormat:@"%.2f",model.price];
    if (self.type == CourseCollectionCellTypeTasteCourse) {
        [_priceLabel setText:@"开始体验"];
    } else {
        [_priceLabel setText:[priceStr isEqualToString:@"0.00"] ? @"免费" : [CommonTool putTwoStringTogether:@"¥ " and:priceStr]];
    }
    
    NSString *str = @"实付: ";
    self.totalPriceLabel.text = [CommonTool putTwoStringTogether:str and:priceStr];

    NSMutableAttributedString *attrDescribeStr = [[NSMutableAttributedString alloc] initWithString:self.totalPriceLabel.text];
    [attrDescribeStr addAttribute:NSForegroundColorAttributeName value:NORMARL_FONT_COLOR range:[self.totalPriceLabel.text rangeOfString:str]];
    _totalPriceLabel.attributedText = attrDescribeStr;

}

#pragma mark - layout
- (void)layoutSubviews
{
    [_imgView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self).and.offset(10 *SCALE_WIDTH);
        make.left.mas_equalTo(self).and.offset(10 *SCALE_WIDTH);
        make.width.mas_equalTo(125 *SCALE_WIDTH);
        make.height.mas_equalTo(70 *SCALE_WIDTH);
    }];
    
    [_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(_imgView).and.offset(5 *SCALE_WIDTH);
        make.left.mas_equalTo(_imgView.mas_right).and.offset(13 *SCALE_WIDTH);
        make.right.mas_equalTo(self).and.offset(-13 *SCALE_WIDTH);
        make.height.mas_equalTo(35 *SCALE_WIDTH);
    }];
    
    if (self.type != CourseCollectionCellTypeOrder) {
        [_courseHourLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(_titleLabel.mas_bottom).and.offset(10 *SCALE_WIDTH);
            make.height.mas_equalTo(10 *SCALE_WIDTH);
            make.left.mas_equalTo(_titleLabel);
            if (self.type == CourseCollectionCellTypeNormal) {
                make.right.mas_equalTo(self).and.offset(-15 *SCALE_WIDTH);
            }else {
                make.right.mas_equalTo(self).and.offset(-100 *SCALE_WIDTH);
            }
        }];
    }

    if (self.type == CourseCollectionCellTypeMyCourse) {
        [_learnStateLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(_courseHourLabel);
            make.height.mas_equalTo(10 *SCALE_WIDTH);
            make.right.mas_equalTo(self).and.offset(-15 *SCALE_WIDTH);
            make.width.mas_equalTo(60 *SCALE_WIDTH);
        }];
    }
    
    if (self.type == CourseCollectionCellTypeCollect || self.type == CourseCollectionCellTypeTasteCourse) {
        [_priceLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(_courseHourLabel);
            make.height.mas_equalTo(10 *SCALE_WIDTH);
            make.right.mas_equalTo(self).and.offset(-15 *SCALE_WIDTH);
            make.width.mas_equalTo(80 *SCALE_WIDTH);
        }];
    }
    
    if (self.type == CourseCollectionCellTypeOrder) {
        [_priceLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(_titleLabel.mas_bottom).and.offset(10 *SCALE_WIDTH);
            make.height.mas_equalTo(10 *SCALE_WIDTH);
            make.left.mas_equalTo(_titleLabel);
            make.right.mas_equalTo(self).and.offset(-70 *SCALE_WIDTH);
        }];
        
        [_lineView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(_imgView.mas_bottom).and.offset(10 *SCALE_WIDTH);
            make.left.mas_equalTo(_imgView);
            make.right.mas_equalTo(self).and.offset(-10 *SCALE_WIDTH);
            make.height.mas_equalTo(LINE_PX);
        }];
        
        [_orderNumberLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(_lineView.mas_bottom);
            make.left.mas_equalTo(_lineView);
            make.right.mas_equalTo(self).and.offset(-120 *SCALE_WIDTH);
            make.bottom.mas_equalTo(self);
        }];
        
        [_totalPriceLabel mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(_orderNumberLabel);
            make.right.mas_equalTo(self).and.offset(-10 *SCALE_WIDTH);
            make.bottom.mas_equalTo(self);
            make.left.mas_equalTo(_orderNumberLabel.mas_right).and.offset(10 *SCALE_WIDTH);
        }];
    }
    
}

@end
上一篇下一篇

猜你喜欢

热点阅读