Objective-C 学习记录 - 25

1.获取文字尺寸的方法
单行文字:

NSDictionary *nameAttr = @{NSFontAttributeName : [UIFont systemFontOfSize:15]};   //将文字的字体大小等存入字典
CGSize nameSize = [self.phoneModel.name sizeWithAttributes:nameAttr];  //通过字典提供的属性信息计算得到文字的尺寸
CGFloat text_LabelW = nameSize.width;  //取得文字宽度
CGFloat text_LabelH = nameSize.width;  //取得文字高度
self.text_Label.frame = CGRectMake(text_LabelX, text_LabelY, text_LabelW, text_LabelH);  //设置frame

多行文字:

text_Label.numberOfLines = 0;  //设置自动换行
CGFloat text_LabelW = self.contentView.frame.size.width - 2 * space;  //设置文本的宽度
CGSize textSize = CGSizeMake(text_LabelW, MAXFLOAT);  //设置一个用来装文本的尺寸
CGFloat text_LabelH = [self.text boundingRectWithSize:textSize options:NSStringDrawingUsesLineFragmentOrigin attributes:text_LabelAttr context:nil].size.height;   //通过字体大小和文字框的尺寸得到文本的高度
self.text_Label.frame = CGRectMake(text_LabelX, text_LabelY, text_LabelW, text_LabelH);  //设置frame

2.设置不等高cell的方法
在数据模型或者其他模型中计算好各个控件的frame,并在其.h文件中添加CGRect属性存储各个frame和CGFloat属性存储cell高度,在控制器的heightForRowAtIndexPath方法和cell类的layoutSubviews中调用这些属性。

例:

/** 模型类中 定义接口属性:*/
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSString *icon;
@property (strong, nonatomic) NSString *text;
@property (assign, nonatomic ,getter=isVip) BOOL vip;
@property (strong, nonatomic) NSString *image;

@property (assign, nonatomic) CGRect nameFrame;
@property (assign, nonatomic) CGRect iconFrame;
@property (assign, nonatomic) CGRect textFrame;
@property (assign, nonatomic) CGRect vipFrame;
@property (assign, nonatomic) CGRect imageFrame;
@property (assign, nonatomic) CGFloat cellHeight;

/** 模型类中 实现方法,在其中计算好各个子控件的frame和cellHeight的值 */
-(CGFloat)cellHeight
{
    CGFloat space = 10;
    CGFloat iconViewX = space;
    CGFloat iconViewY = space;
    CGFloat iconViewWH = 30;
    self.iconFrame = CGRectMake(iconViewX, iconViewY, iconViewWH, iconViewWH);
    
    CGFloat nameLabelX = iconViewX + iconViewWH + space;
    CGFloat nameLabelY = space;
    NSDictionary *nameAttr = @{NSFontAttributeName : nameFont};  
    CGSize nameSize = [self.name sizeWithAttributes:nameAttr];  
    CGFloat nameLabelW = nameSize.width;
    CGFloat nameLabelH = nameSize.height;
    self.nameFrame = CGRectMake(nameLabelX, nameLabelY, nameLabelW, nameLabelH);
    
    if (self.isVip ) {
        CGFloat vipViewX = CGRectGetMaxX(self.nameFrame) + space;
        CGFloat vipViewWH = 14;
        CGFloat vipViewY = nameLabelY + (nameLabelH - vipViewWH) * 0.5;
        self.vipFrame = CGRectMake(vipViewX, vipViewY, vipViewWH, vipViewWH);
    }
    
    CGFloat text_LabelX = space;
    CGFloat text_LabelY = CGRectGetMaxY(self.iconFrame) + space;
    CGFloat text_LabelW = [UIScreen mainScreen].bounds.size.width - 2 * space;
    CGSize textSize = CGSizeMake(text_LabelW, MAXFLOAT);
    NSDictionary *text_LabelAttr = @{NSFontAttributeName : textFont};
    CGFloat text_LabelH = [self.text boundingRectWithSize:textSize options:NSStringDrawingUsesLineFragmentOrigin attributes:text_LabelAttr context:nil].size.height;
    self.textFrame = CGRectMake(text_LabelX, text_LabelY, text_LabelW, text_LabelH);
    
    CGFloat cellHeight = 0;
    if (![self.image isEqualToString:@“”]) {
        CGFloat imageWH = 100;
        CGFloat imageX = iconViewX;
        CGFloat imageY = CGRectGetMaxY(self.textFrame) + space;
        self.imageFrame = CGRectMake(imageX, imageY, imageWH, imageWH);
        cellHeight = CGRectGetMaxY(self.imageFrame) + space;
    } else {
        cellHeight = CGRectGetMaxY(self.textFrame) + space;
    }
    return cellHeight;

}

/** 自定义的UITableViewCell类中 通过layoutSubviews方法调用模型中的各个frame属性布局子控件 */
-(void)layoutSubviews
{
    [super layoutSubviews];
    self.iconView.frame = self.phoneModel.iconFrame;
    self.nameLabel.frame = self.phoneModel.nameFrame;
    self.vipView.frame = self.phoneModel.vipFrame;
    self.text_Label.frame = self.phoneModel.textFrame;
    self.image_View.frame = self.phoneModel.imageFrame;
}

/** 控制器中 通过heightForRowAtIndexPath:方法获取模型中的cellHeight传递给tableView */
-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    phoneModel *tempModel = self.phoneModels[indexPath.row];
    return tempModel.cellHeight;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值