一、自定义Cell

  • 为什么需要自定义cell:系统提供的cell满足不了复杂的样式,因此:自定义Cell和自定义视图一样,自己创建一种符合我们需求的Cell并使用这个Cell。如下图所示的这些Cell都是通过自定义Cell样式实现的:
  • 自定义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(, , , )];
//    self.headerImageView.backgroundColor = [UIColor orangeColor];
    self.headerImageView.layer.masksToBounds = YES;
    self.headerImageView.layer.cornerRadius = ;
    // cell提供了一个contentView的属性,专门用来自定义cell,防止在cell布局的时候发生布局混乱,如果是自定义cell,记得将子控件添加到ContentView上
    [self.contentView addSubview:self.headerImageView];

    // 2.姓名
    self.nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.headerImageView.frame) + , CGRectGetMinY(self.headerImageView.frame), , )];
//    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) + , , )];
//    self.phoneLabel.backgroundColor = [UIColor greenColor];
    [self.contentView addSubview:self.phoneLabel];

}
  • 注意:
  • 确保所有的你想添加的子视图都在自定义Cell的初始化方法中创建,由于UITableView的重用机制,一个Cell在第一次创建成功并用于下一次显示的时候,不会再走初始化方法,这样可以避免子视图的重复创建。
  • 在Cell的子视图创建成功后,将子视图设置为属性,类似于UITableViewCell所自带的textLabel和detailTextLabel属性。便于在UITableView的协议中给自定义视图赋值。

二、Model类型对象的使用

  • Model类概述:
  • Model类主要是为了给我们提供数据,简单的说即自定义类且继承于NSObject的称之为Model。(前面OC学到的KVC就是帮助我们将字典转换为Model类。)
  • 在自定义Cell中使用Model类存放数据:
  • 首先创建Model类并继承于NSObject
  • 然后添加和字典中对应的属性
  • 在视图控制器中将字典通过KVC为Model赋值
  • 将Model对象添加到数组中并刷新TableView
// 建立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 {

    ;
}

- (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
{
    ;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

}

@end

  3.运行效果如下图:

三、多种Cell混合使用

  • 一个重用标识符只能针对于一种Cell样式,不同的Cell需要基于不同的重用标识符来进行区分,而重用标识符的区分需要根据不同的情况来划分,比如:
  • model属性划分(不同的数据内容,比如一个数据中有type字段,为1代表图片类型,为0代表文字类型等)
  • 固定的行显示的Cell类型不一样
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *identifier1 = @"labelCell";
    static NSString *identifier2 = @"imageCell";
    Person *person = self.allPersonsArray[indexPath.row];
    "]) {
        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自适应高度

  • 当每个Cell都有不同的高度时,就需要Cell去自适应高度
  • 方式为两种:
  • 文本自适应高度:根据文本内容设定Label高度
  • 图片自适应高度:根据图片宽度进行等比例缩放
  • 这里需要创建一个新的类去封装这两个方法用以获得文本的高度和图片的高度:
@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, );
    // 第二个参数,设置以行高为单
    // 第三个参数,根据字体判断高度
    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
												

iOS学习之UI自定义cell的更多相关文章

  1. iOS学习之UI可视化编程-XIB

    一.Interface Builder可视化编程 1.Interface Builder简介: GUI:图形用户界面(Graphical User Interface,简称GUI,又称图形用户接口)是 ...

  2. iOS学习之UI可视化编程-StoryBoard

    一.StoryBoard与xib 对比: 相同点:都属于IB编程的方式,可以快速构建GUI. 不同点:xib侧重于单文件(单独的控制器或者视图)编辑,storyboard侧重于多页面关联.storyb ...

  3. iOS学习之UITableView中Cell的操作

    接着iOS学习之Table View的简单使用 这篇,这里主要讲UITableView 中的Cell的操作,包括标记.移动.删除.插入. 为了简单快捷,直接从原来那篇的代码开始,代码下载地址:http ...

  4. iOS 中使用 XIB 自定义cell 的两种方法 以及 编译出现常见 的错误 ++++(xcode6.0之后)

    一. 注册cell 1.创建自定义cell并勾选 xib :(勾选xib就会自动生成与cell文件关联的xib) 2.在 tableViewController里注册自定义Cell (或者遵守tabl ...

  5. iOS 中使用 XIB 自定义cell的两种方法以及编译出现常见 的错误 (xcode6.0之后)

    一. 注册cell 1.创建自定义cell并勾选 xib :(勾选xib就会自动生成与cell文件关联的xib) 2.在 tableViewController里注册自定义Cell (或者遵守tabl ...

  6. iOS开发总结-UITableView 自定义cell和动态计算cell的高度

    UITableView cell自定义头文件:shopCell.h#import <UIKit/UIKit.h>@interface shopCell : UITableViewCell@ ...

  7. iOS 学习 - 18.TextField 自定义菜单事件,复制和微信分享

    菜单事件包括,剪切.拷贝.全选.分享...,此 demo 只有 copy.share 1.定义 field 继承与 UITextField - (BOOL)canPerformAction:(SEL) ...

  8. iOS深入学习(UITableView系列4:使用xib自定义cell)

    可以通过继承UITableViewCell重新自定义cell,可以像下面一样通过代码来自定义cell,但是手写代码总是很浪费时间, ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  9. AJ学IOS(17)UI之纯代码自定义Cell实现新浪微博UI

    AJ分享,必须精品 先看效果图 编程思路 代码创建Cell的步骤 1> 创建自定义Cell,继承自UITableViewCell 2> 根据需求,确定控件,并定义属性 3> 用get ...

随机推荐

  1. c++回调

    c++回调包含类函数回调和非类函数回调. 类函数回调,函数指针指向函数名称,需要带类作用域,调用时需要用到类指针. 如qt里面定义一个返回值为qbytearray的函数指针, typedef QByt ...

  2. [SSH 3]以网上商城项目浅谈spring配置

    导读:在做ITOO项目的时候,就用到了容器+反射,从而运用了依赖注入和依赖查找.如果看过WCF端的配置文件,那么对于这个spring的配置就很容易理解.本篇博客,是对于自己做的一个小项目中所运用到的s ...

  3. qq 登录 cordova插件

    1.下载open-sdk.jar文件和mta_sdk_x.x.x.jar文件拷贝到libs(或lib)目录下这个链接 很容易的把环境配置好http://wiki.connect.qq.com/%E5% ...

  4. myecplise tomcat jdk

    myeclipse是javaweb初学者或者工程师非常常用的软件.那么在MyEclipse中如何使用自己安装的JDK和tomcat呢.下面是JDK1.7+tomcat7.0+myeclipse10的j ...

  5. .net orm比较之dapper和Entity Framework6的简单测试比较

    .net orm比较之dapper和Entity Framework6的简单测试比较

  6. 错误处理php

    一 HP关闭脚本错误提示的方法: 打开PHP安装目录下的php.ini文件 找到display_errors = On 修改为 display_errors = off 注意:如果你已经把PHP.in ...

  7. 用PHP实现守护进程任务后台运行与多线程(php-resque使用说明)

    消息队列处理后台任务带来的问题 项目中经常会有后台运行任务的需求,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的操 ...

  8. CSS 居中效果完整指南

    本文翻译自:<Centering in CSS: A Complete Guide> 使用 CSS 实现效果困难吗?显然不是.实际上有许多方法可以实现居中效果,但在具体情况中,我们往往无法 ...

  9. IIS服务器环境配置(一)

    在开始-> 控制面板 ->打开或关闭功能 IIS 服务器程序 勾选  HTML勾选 完成添加后  重启  确认是否添加上在控制面板的 管理工具中查看

  10. php 递归 适合刚刚接解递归的人看

    递归,就是自己调用自己,当满足某条件时层层退出(后进先出). --------------------------------------------------------------------- ...