标签:
一、自定义Cell
1.首先创建一个继承于UITableViewCell的类:(这是一个简易的通讯录的自定义cell)
@interface RootTableViewCell : UITableViewCell // 联系人头像 @property (nonatomic, strong) UIImageView *headerImageView; // 联系人姓名label @property (nonatomic, strong) UILabel *nameLabel; // 电话号码的label @property (nonatomic, strong) UILabel *phoneLabel; @end
2.实现UITableViewCell的初始化方法:
@implementation RootTableViewCell - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { // 初始化子视图 [self initLayout]; } return self; } - (void)initLayout { // 1.头像 self.headerImageView = [[UIImageView alloc] initWithFrame:CGRectMake(16, 10, 100, 100)]; // self.headerImageView.backgroundColor = [UIColor orangeColor]; self.headerImageView.layer.masksToBounds = YES; self.headerImageView.layer.cornerRadius = 50; // cell提供了一个contentView的属性,专门用来自定义cell,防止在cell布局的时候发生布局混乱,如果是自定义cell,记得将子控件添加到ContentView上 [self.contentView addSubview:self.headerImageView]; // 2.姓名 self.nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.headerImageView.frame) + 10, CGRectGetMinY(self.headerImageView.frame), 100, 40)]; // self.nameLabel.backgroundColor = [UIColor redColor]; [self.contentView addSubview:self.nameLabel]; // 3.电话号码 self.phoneLabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMinX(self.nameLabel.frame), CGRectGetMaxY(self.nameLabel.frame) + 20, 200, 40)]; // self.phoneLabel.backgroundColor = [UIColor greenColor]; [self.contentView addSubview:self.phoneLabel]; }
二、Model类型对象的使用
// 建立model存放数据 @interface Contact : NSObject // 姓名 @property (nonatomic, copy) NSString *name; // 手机号码 @property (nonatomic, copy) NSString *phoneNumber; // 图片名 @property (nonatomic, copy) NSString *imageName; @end
#import "RootTableViewController.h" #import "Contact.h" #import "RootTableViewCell.h" @interface RootTableViewController () // 声明一个大数组存放所有联系人 @property (nonatomic, strong) NSMutableArray *allContactsArray; @end @implementation RootTableViewController // 懒加载 (重写getter方法) - (NSMutableArray *)allContactsArray { if (_allContactsArray == nil) { _allContactsArray = [NSMutableArray array]; } return _allContactsArray; } - (void)viewDidLoad { [super viewDidLoad]; self.title = @"通讯录"; self.navigationController.navigationBar.barTintColor = [UIColor lightGrayColor]; [self handleData]; } - (void)handleData { // 读取plist文件 NSMutableArray *array =[NSMutableArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Contacts" ofType:@"plist"]]; // 将要显示的数据转为model对象 for (NSDictionary *contactDict in array) { Contact *contact = [[Contact alloc] init]; // 使用KVC赋值 [contact setValuesForKeysWithDictionary:contactDict]; // 将联系人model存放在大数组中 [self.allContactsArray addObject:contact]; } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return self.allContactsArray.count; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 1; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 创建常量标识符 static NSString *identifier = @"cell"; // 从重用队列里查找可重用的cell RootTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; // 判断如果没有可以重用的cell,创建 if (!cell) { cell = [[RootTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier]; } // 设置数据 // 取出model对象 Contact *contact = self.allContactsArray[indexPath.section]; cell.headerImageView.image = [UIImage imageNamed:contact.imageName]; cell.nameLabel.text = contact.name; cell.phoneLabel.text = contact.phoneNumber; cell.selectionStyle = UITableViewCellSelectionStyleNone; return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 120; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; } @end
3.运行效果如下图:
三、多种Cell混合使用
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *identifier1 = @"labelCell"; static NSString *identifier2 = @"imageCell"; Person *person = self.allPersonsArray[indexPath.row]; if ([person.type isEqualToString:@"1"]) { LableCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier1 forIndexPath:indexPath]; cell.nameLabel.text = person.name; cell.statusLabel.text = person.status; return cell; }else { ImageViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier2 forIndexPath:indexPath]; cell.nameLabel.text = person.name; cell.statusLabel.text = person.status; cell.myImageView.image = [UIImage imageNamed:person.imageName]; return cell; } }
四、Cell自适应高度
@interface CalculateTextHeight : NSObject // 声明类方法用来计算文本高度 + (CGFloat)calculateTextHeightWithText:(NSString *)text font:(UIFont *)font; + (CGFloat)imageHeightWithImage:(UIImage *)image; @end
@implementation CalculateTextHeight + (CGFloat)calculateTextHeightWithText:(NSString *)text font:(UIFont *)font { // iOS7.0中求文本高度的方法,返回一个CGRect的高度 // 第一个参数,一个屏幕宽,10000高的文本 CGSize size = CGSizeMake([UIScreen mainScreen].bounds.size.width, 10000); // 第二个参数,设置以行高为单 // 第三个参数,根据字体判断高度 CGRect rect = [text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : font} context:nil]; return rect.size.height; } + (CGFloat)imageHeightWithImage:(UIImage *)image { // 得到图片的宽和高 CGFloat width = image.size.width; CGFloat height = image.size.height; // 得到宽高比例和屏幕宽度 float i = height / width; float j = [UIScreen mainScreen].bounds.size.width; CGFloat x = i * j; return x; } @end
+ (CGFloat)imageHeightWithImage:(UIImage *)image { // 得到图片的宽和高 CGFloat width = image.size.width; CGFloat height = image.size.height; // 得到宽高比例和屏幕宽度 // 屏幕的宽高比例用CGFloat接收 CGFloat i = height / width; CGFloat j = [UIScreen mainScreen].bounds.size.width; CGFloat x = i * j; return x; // 或者直接返回 // return height / width *[UIScreen mainScreen].bounds.size.width; }
标签:
原文地址:http://www.cnblogs.com/soley/p/5418544.html