• UITableViewCell自定义


    ⼀、⾃定义Cell
     
     
    UITableView中系统的cell共提供了四种默认样式,分别是:
    UITableViewCellStyleDefault
    UITableViewCellStyleValue1
    UITableViewCellStyleValue2
    UITableViewCellStyleSubtitle
     
    ⼆、Model类型对象的使⽤
     
    Model类主要是为了给我们提供数据,简单⽽⾔即⾃定义 类且继承于NSObject的称之为Model。⽽继承于UIView的 称之为View类。 
    现在我们的数据提供都是存放在数组和字典中,OC中的 KVC就是帮助我们将字典转换为Model类⽽存在的
    Model的使用
    创建步骤:
    • 创建⼀个类并继承于NSObject
    • 添加和字典中对应的属性
    • 在视图控制器中将字典通过KVC为Model赋值
    • 将Model对象添加到数组中并刷新TableView
     
    三、多种Cell混合使⽤
     
    使用场景
    ⼀个重⽤标识符只能针对于⼀种Cell样式,不同的Cell需要 基于不同的重⽤标识符来进⾏区分,⽽重⽤标识符的区分需 要根据不同的情况来划分,⽐如:
    • model属性划分(不同的数据内容,⽐如⼀个数据中有 type字段,为1代表图⽚类型,为0代表⽂字类型)
    Model *model = [self.tableArray
                        objectAtIndex:indexPath.row];
        //根据model属性划分
        if (model.type == 0) {
            FirstTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:firstIdentify];
            return cell;
        }
       
        if (model.type == 1) {
            SecondTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:secondIdentify];
            return cell;
        }
    • 固定的⾏显⽰的Cell类型不⼀样
    // 第⼀⾏显⽰第⼀种Cell
        if (indexPath.row == 0) {
            FirstTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:firstIdentify];
            return cell;
        }
        // 第⼆⾏显⽰第⼆种Cell
        if (indexPath.row == 1) {
            SecondTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:secondIdentify];
            return cell;
        }
     
    四、Cell⾃适应⾼度
     
     
    • 文本自适应高度   根据⽂本内容设定Label⾼度
     
    NSString *str = @"《纽约时报》称,尽管双⽅可能会在⽓候变化这样的问题上达成共识,但在中美存在争议的议题上,预计主席不会做出什么让步。这些问题包括⺴络间谍、在南海争议海域填海造岛,以及中国对在其境内经营的外国企业和⾮政府组织加紧了控制。";
    // 获得字体样式属性
    NSDictionary *att = @{NSFontAttributeName:[UIFont systemFontOfSize:17.0]};
    // 根据字体样式属性获得⾼度
    CGRect rect = [str boundingRectWithSize:CGSizeMake(200, 10000) options:NSStringDrawingUsesLineFragmentOrigin attributes:att context:nil];
    [self.showLabel setFrame:CGRectMake(0, 0, 200, rect.size.height)];
     
    • 图片自适应高度   根据图⽚宽度进⾏等⽐例缩放
    UIImage *aImage = [UIImage imageNamed:@"1.png"];
        // 获得图⽚真实⾼度和宽度
        CGFloat height = aImage.size.height;
        CGFloat width = aImage.size.width;
        // 缩放后宽度固定为200
        CGFloat scale = width / 200;
        CGFloat realHeight = height / scale;
        [self.myImageView setFrame:CGRectMake(0,0,200,realHeight)];
     
    代码步骤:
    //1、自定义cell的第一步,将所有cell要显示的子视图控件声明成属性
    @property (nonatomic, retain) UIImageView *headerImageView;//头像
    @property (nonatomic, retain) UILabel *nameLabel;//姓名
    @property (nonatomic, retain) UILabel *genderLabel;//性别
    @property (nonatomic, retain) UILabel *ageLabel;//年龄
     
    //2、重写cell的初始化方法,frame给定为0,将控件添加到cell上面进行显示,一定要注意使用self.contentView添加
    - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
        self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
        if (self) {
            _headerImageView = [[UIImageView alloc] initWithFrame:CGRectZero];
            _headerImageView.backgroundColor = [UIColor orangeColor];
            _nameLabel = [[UILabel alloc] initWithFrame:CGRectZero];
            _nameLabel.backgroundColor = [UIColor yellowColor];
            _genderLabel = [[UILabel alloc] initWithFrame:CGRectZero];
            _genderLabel.backgroundColor = [UIColor cyanColor];
            _ageLabel = [[UILabel alloc] initWithFrame:CGRectZero];
            _ageLabel.backgroundColor = [UIColor purpleColor];
            //自定义cell内部添加子视图, 不能使用self,应该是使用sele.contentView
           
            [self.contentView addSubview:_nameLabel];
            [self.contentView addSubview:_genderLabel];
            [self.contentView addSubview:_ageLabel];
            [self.contentView addSubview:_headerImageView];
        }
        return self;
    }
     
    //3、重写layoutSubviews方法,给定内部控件的具体位置
    - (void)layoutSubviews {
        [super layoutSubviews];
        _headerImageView.frame = CGRectMake(5, 5, 50, 80);
        _nameLabel.frame = CGRectMake(65, 5, 100, 20);
        _genderLabel.frame = CGRectMake(65, 35, 100, 20);
        _ageLabel.frame = CGRectMake(65, 65, 100, 20);
    }
     
    //4、导入模型,将模型与cell绑定,声明模型属性
    //在cell内部绑定一个模型属性
    @property (nonatomic, retain) Student *modelStu;
     
    //5、重写模型的setter方法,内部使用模型为内部控件赋值
    - (void)setModelStu:(Student *)modelStu {
        if (_modelStu != modelStu) {
            [_modelStu release];
            _modelStu = [modelStu retain];
            //为内部控件进行赋值
            _headerImageView.image = [UIImage imageNamed:_modelStu.picture];
            _nameLabel.text = _modelStu.name;
            _genderLabel.text = _modelStu.gender;
            _ageLabel.text = _modelStu.age;
        }
    }
     
    //求一段文本的显示高度
    + (CGFloat)heightForString:(NSString *)string {
       
        NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont systemFontOfSize:17], NSFontAttributeName, nil];
       
        CGRect rect = [string boundingRectWithSize:CGSizeMake(3 *kImageWidth, 1000) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil];
       
        return rect.size.height;
    }

    //返回cell的高度
    + (CGFloat)cellHeightForStudent:(Student *)student {
       
        CGFloat totalHeight = 65 + [BoyTableViewCell heightForString:student.introduce];
       
        return  totalHeight > 120 ? totalHeight : 120;
    }
     
    //6、内存管理
    - (void)dealloc {
        [_nameLabel release];
        [_genderLabel release];
        [_ageLabel release];
        [_headerImageView release];
        [_modelStu release];
        [super dealloc];
    }
     
     
    //在MyTableViewController.m中
     
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        //先获取模型
        Student *student = _dataArray[indexPath.row];
        if ([student.sex isEqualToString:@"男"]) {
            return [BoyTableViewCell cellHeightForStudent:student];
        } else if ([student.sex isEqualToString:@"女"]) {
            return [GirlTableViewCell cellHeightForStudent:student];
        }
        return 0;
    }
  • 相关阅读:
    java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁(转)
    MySQL存储引擎--MyISAM与InnoDB区别
    Socket详解
    Java线程池参数
    Java反射机制(转)
    java注解
    docker入门实例
    docker常用命令总结
    showdoc 自动脚本安装
    [mysql]You must reset your password using ALTER USER statement before executing this statement.
  • 原文地址:https://www.cnblogs.com/Walking-Jin/p/5211146.html
Copyright © 2020-2023  润新知