源码-020501-自定义非等高cell-storyboard

//
//  XMGStatusesViewController.m
//  备课03-不等高的cell-非代码

#import "XMGStatusesViewController.h"
#import "XMGStatus.h"
#import "XMGStatusCell.h"

@interface XMGStatusesViewController ()
@property (strong, nonatomic) NSArray *statuses;
@end

@implementation XMGStatusesViewController

- (NSArray *)statuses
{
    if (_statuses == nil) {
        // 加载plist中的字典数组
        NSString *path = [[NSBundle mainBundle] pathForResource:@"statuses.plist" ofType:nil];
        NSArray *dictArray = [NSArray arrayWithContentsOfFile:path];

        // 字典数组 -> 模型数组
        NSMutableArray *statusArray = [NSMutableArray array];
        for (NSDictionary *dict in dictArray) {
            XMGStatus *status = [XMGStatus statusWithDict:dict];
            [statusArray addObject:status];
        }
        _statuses = statusArray;
    }
    return _statuses;
}

- (void)viewDidLoad {
    [super viewDidLoad];

}

#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.statuses.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    XMGStatusCell *cell = [XMGStatusCell cellWithTableView:tableView];
    cell.status = self.statuses[indexPath.row];
    return cell;
}

#pragma mark - 代理方法
/**
 *  返回每一行的高度
 */
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    XMGStatus *staus = self.statuses[indexPath.row];
    return staus.cellHeight;
}
/**
 * 返回每一行的估计高度
 * 只要返回了估计高度,那么就会先调用tableView:cellForRowAtIndexPath:方法创建cell,  再调用tableView:heightForRowAtIndexPath:方法获取cell的真实高度
 */
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 200;
}
@end
//
//  XMGStatus.h
#import <UIKit/UIKit.h>

@interface XMGStatus : NSObject
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSString *text;
@property (strong, nonatomic) NSString *icon;
@property (strong, nonatomic) NSString *picture;
@property (assign, nonatomic, getter=isVip) BOOL vip;

/** cell的高度 */
@property (assign, nonatomic) CGFloat cellHeight;

+ (instancetype)statusWithDict:(NSDictionary *)dict;
@end
//
//  XMGStatusCell.m
//  07-自定义非等高cell-xib
#import "XMGStatusCell.h"
#import "XMGStatus.h"

@interface XMGStatusCell()
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UIImageView *vipView;
@property (weak, nonatomic) IBOutlet UILabel *contentLabel;
@property (weak, nonatomic) IBOutlet UIImageView *pictureView;

@end

@implementation XMGStatusCell

+ (instancetype)cellWithTableView:(UITableView *)tableView
{
    return [tableView dequeueReusableCellWithIdentifier:@"status"];
}

- (void)awakeFromNib
{
    // 设置label每一行文字的最大宽度
    // 为了保证计算出来的数值 跟 真正显示出来的效果 一致
    self.contentLabel.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20;
}

- (void)setStatus:(XMGStatus *)status
{
    _status = status;

    if (status.isVip) {
        self.nameLabel.textColor = [UIColor orangeColor];
        self.vipView.hidden = NO;
    } else {
        self.nameLabel.textColor = [UIColor blackColor];
        self.vipView.hidden = YES;
    }

    self.nameLabel.text = status.name;
    self.iconView.image = [UIImage imageNamed:status.icon];
    if (status.picture) {
        self.pictureView.hidden = NO;
        self.pictureView.image = [UIImage imageNamed:status.picture];
    } else {
        self.pictureView.hidden = YES;
    }
    self.contentLabel.text = status.text;

    // 强制布局
    [self layoutIfNeeded];

    // 计算cell的高度
    if (self.pictureView.hidden) { // 没有配图
        status.cellHeight = CGRectGetMaxY(self.contentLabel.frame) + 10;
    } else { // 有配图
        status.cellHeight = CGRectGetMaxY(self.pictureView.frame) + 10;
    }
}

@end
时间: 2024-10-29 03:37:00

源码-020501-自定义非等高cell-storyboard的相关文章

源码-0203-06-自定义非等高cell-xib

// // XMGStatusesViewController.m // 备课03-不等高的cell-非代码 #import "XMGStatusesViewController.h" #import "XMGStatus.h" #import "XMGStatusCell.h" @interface XMGStatusesViewController () @property (strong, nonatomic) NSArray *statu

自定义非等高cell01-xib

UITableView中有很多情况下cell的高度是不固定的,这时候cell的高度取决于内容的多少,今天介绍几个方法来达到自定义非等高cell的效果. LMTestCell.h中加入方法: /** 返回cell 高度*/ -(CGFloat)cellHeight; LMTestCell.m中对应方法: -(CGFloat)cellHeight { if (self.pictureView.hidden) { return CGRectGetMaxY(self.contentLabel.frame

iOS边练边学--自定义非等高的cell

一.使用xib或者storyboard自定义非等高的cell实现方式差不多,这里简单介绍一下通过xib文件实现的方法 <1.1>创建一个继承自UITableViewCell的子类,比如ChaosWeiboCell <1.2>在模型中增加一个cellHeight属性,用来存放对应的cell的高度 #import <UIKit/UIKit.h> // 这里修改成UIKit框架 @interface ChaosWeibo : NSObject // 模型类 /** 正文 */

【Spring源码分析】非懒加载的Bean实例化过程(下篇)

doCreateBean方法 上文[Spring源码分析]非懒加载的Bean实例化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireCapableBeanFactory的doCreateBean方法代码: 1 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[]

Redis源码阅读(二)高可用设计——复制

Redis源码阅读(二)高可用设计-复制 复制的概念:Redis的复制简单理解就是一个Redis服务器从另一台Redis服务器复制所有的Redis数据库数据,能保持两台Redis服务器的数据库数据一致. 使用场景:复制机制很实用,在客户端并发访问量很大,单台Redis扛不住的情况下,可以部署多台Redis复制相同的数据,共同对外提供服务,提高Redis并发访问处理能力.当然这种通过复制方式部署多台Redis以提高并发处理能力的方式只适用于客户端大部分访问为读数据请求的场景.此外,Redis从2.

zabbix源码安装,自定义监控205的用户数,有触发器但没有邮件报警

zabbix源码安装,自定义监控205的用户数,有触发器但没有邮件报警 监控端配置:(192.168.4.5) 1基础环境:(实验环境可以关闭防火墙,但生产环境不能关闭,否则不安全,要设置相应规则) [[email protected]桌面]# /etc/init.d/iptables stop [[email protected]桌面]# setenforce 0 2搭建lamp平台,(它运行在lamp平台上) [[email protected]桌面]# yum -y install htt

自定义非等高cell02-xib

在model中加入一个属性,cell的高度. LMTestModel.h #import <UIKit/UIKit.h> #import "LMTestModel.h" @interface LMTestCell : UITableViewCell @property (weak, nonatomic) IBOutlet UILabel *nameLabel; @property (weak, nonatomic) IBOutlet UILabel *contentLabe

STL源码剖析简体中文完整版(高清晰扫描带目录)PDF下载

网盘下载:STL源码剖析简体中文完整版(高清晰扫描带目录)PDF下载 – 易分享电子书PDF资源网 作者: 侯捷 出版社: 华中科技大学出版社 出版年: 2002-6 页数: 493 定价: 68.00元 装帧: 平装 ISBN: 9787560926995 内容简介 · · · · · · 学习编程的人都知道,阅读.剖析名家代码乃是提高水平的捷径.源码之前,了无秘密.大师们的缜密思维.经验结晶.技术思路.独到风格,都原原本本体现在源码之中. 这本书所呈现的源码,使读者看到vector的实现.l

自定义不等高cell—storyBoard或xib自定义不等高cell

1.iOS8之后利用storyBoard或者xib自定义不等高cell: 对比自定义等高cell,需要几个额外的步骤(iOS8开始才支持) 添加子控件和contentView(cell的contentView)之间的间距约束(需要代码控制约束) 设置tableViewCell的真实行高和估算行高 // 以下两行代码就被苹果成为self0sizing技术,可惜只能在iOS8及其之后应用 // 告诉tableView所有cell的真实高度是自动计算(根据设置的约束来计算) self.tableVie