UITableVie 中系统的Cell共提供了四种默认样式, 分别是:
UITableVieCellStyleDefault
UITableVieCellStyleValue1
UITableVieCellStyleValue2
UITableVieCellStyleSubtitle
实际我们往往需要的是更为复杂或者专门效果展示所以需要按照要求去自己定义cell
自定义Cell步骤:
1.创建一个继承于UITableViewCell的类
-
2.实现UITableVieCell的初始化方法:
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
3.
确保所有的你想添加的子视图都在自定义Cell的初始化方法中创建
,由于UITableView 的重用机制, 一个Cell在第 一次创建成功并于下一 次显示的时候,不会再去走初始化方法
,这样可以避免子视图的重复创建
。4. 在Cell的子视图创建成功后,
将子视图设置为属性
,类似于UITableViewCell所自带的 text Label和detailTextLabel属性。便于在UITableView 的协议中给自定义视图赋值。
多种Cell可以混合使用:
一个重用标识符只能针对于一种Cell样式,不同的Cell样式需要基于不同的重用标识符来进行区分, 重用标识符的区分需要根据不同的情况来划分, 如:
- model属性划分(不同的数据内容, 如 一个数据中有图片类型有文字类型)
- 固定的行显示的Cell类型不一样
布控子视图方法LayoutSubviews的调用场景
- 当前视图添加到父视图的时候
- 当前视图的大小发变化的时候
- 切换横竖屏
- ScrollView 滚动的时候
一般 ,Cell在创建的时候的fame 是(0,0,320,44), 我们给定的Cell的 度 般都会 于这个 。因此:在自定义Cell中创建的子视图的frame为CGRectZero。在Cell添加到TableView上的时候才会给子视图设置frame(即LayoutSubviews方法中),Cell 添加到TableView 的时候其大小已经更改为TableView设定的大小 ,这样就方便布局。
Model的使用:
- Model类主要是为了给我们提供数据,简单的说就是定义类且继承于NSObject的称之为Model。 继承于UIView 的称之为View 类。
- 现在我们的数据提供都是存放在数组和字典中,OC中的KVC就是帮助我们将字典转换为Model类而存在的。
创建步骤:
- 创建一个类并继承于NSObject
- 添加和字典中对应的属性 (根据数据处理)
- 在视图控制器中将字典通过KVC为Model赋值
- 将Model对象添加到数组中并刷新TableView
封装一个自适应高度方法实现两个功能
- 文本自适应高度:根据文本的内容设定Label的高度
- 图片的高度适应:根据图片的宽度进行等比例缩放
建一个工具类GetHeightTool:继承于NSObject
代码
#import <UIKit/UIKit.h> //这个框架要引入因为我们要用这些类
@interface GetHeightTool : NSObject
// 声明两个方法
+ (CGFloat)getHeightForText:(NSString *)textShow
font:(UIFont *)fontShow
width:(CGFloat)widthShow;
+ (CGFloat)getHeightForImage:(NSString *)iamgeName
width:(CGFloat)widthShow;
@end
// 实现部分
// 传入的三个参数
// 参数1: 你需要展示的文字 参数2: 你需要的字体类型一般就是给大小 参数3: 你定义的Label的宽也就是要在多宽的地方展示文字
// 返回值就是你想要的高度
+ (CGFloat)getHeightForText:(NSString *)textShow
font:(UIFont *)fontShow
width:(CGFloat)widthShow
{
// 参数1:
return [textShow boundingRectWithSize:CGSizeMake(widthShow, 10000000) options:(NSStringDrawingUsesLineFragmentOrigin) attributes:@{NSFontAttributeName:fontShow} context:nil].size.height;
}
// 传入参数 (可以根据情况去传参)
// 参数1: 传入照片的名字
// 参数2: 你想要展示的照片宽度
+ (CGFloat)getHeightForImage:(NSString *)iamgeName
width:(CGFloat)widthShow
{
// 按照比例去压缩或者放大
return widthShow / [UIImage imageNamed:iamgeName].size.width * [UIImage imageNamed:iamgeName].size.height;
}
这个就是一个简单的自适应效果,Label的高度会根据要显示的内容去调整, 宽度固定为屏幕的一半.