【QQ聊天界面-计算Frame Objective-C语言】

一、计算frame

1.我还是先把之前的代码保存一份,

我们刚才在第一份代码里面,其实无非就是

1)创建了个模型,

2)懒加载

3)把界面拖了一下

4)创建了一个自定义Cell

是不是就做了这四件事儿

2.那么,接下来,我们是不是要计算坐标了,

计算坐标

好,找到我们这个frame,在这个地方,来计算这个坐标,

计算

好,这个计算坐标,我们无非,第一个是算什么,

1)计算时间Label的frame

2)计算头像的frame

3)计算消息正文的frame

4)计算行高

四个

是不是计算这四个就OK了,

好,来,咱们看一下这四个怎么算啊,

怎么算

1)第一个,注意,第一个,我们这儿有一个Label吧,

Label

我们第一个Label,是不是中间有点儿文字,

那么,我假设,第一个Label,是这么大,

这么大

也就是说,Label的宽,是不是和屏幕一样宽,

Label的高,可以给它指定一个高,自己给它指定一个高,

那么,比如说,是20吧,比如说,Label的高是20,

或者15都行,

然后呢,接下来,我们Label距离左边,距离这个单元格,我们说,当前,整体这是不是一个单元格啊,

单元格

那么,距离这个单元格左上角,是不是0,0

那么,也就是说,X、Y是0,

宽是屏幕的宽,

高是不是直接就给它指定,一个15,

OK,现在,第一个Label的frame,是不是已经确定了,

好,那么我们就给它,看一下第一个Label的frame,

第一个Label

CGFloat timeX = 0;

CGFloat timeY = 0;

CGFloat timeW =

//是不是等于屏幕的那个宽度,320,或者我们直接拿到那个屏幕的宽度,

宽度

//获取屏幕宽度

CGFloat screenW =

//屏幕的宽度,等于多少呢,注意,我们先要拿到当前这个主屏幕,

//怎么拿到呢,UI

UIScreen

//能拿到UIScreen吗,拿不到,为什么,因为这里没有导入头文件,

//我们这里需要引入头文件,UIKit这个包

import <UIKit/UIKit.h>

导入

//好,拿到UIKit以后,这里就能写UIScreen

UIScreen

//UIScreen,有一个叫mainScreen的方法,拿到这个主屏幕,

主屏幕

//主屏幕有一个bounds

CGFloat screenW = [UIScreen mainScreen] . bounds

bounds

//就是主屏幕的一个bounds,bounds,是什么,你还记得吧,

//bounds,X、Y是0,0是不是就包含一个宽、高

//bounds“点儿”什么,size,“点”,width

CGFloat screenW = [UIScreen mainScreen].bounds.size.width;

size.width

//这样是不是拿到它这个宽度了,

//那么,它的宽度就等于,屏幕的宽度

CGFloat timeW = screenW;

屏幕

CGFloat timeH = 15;

高度

//好,那么指定好以后,接下来,我们就是让这个下划线timeFrame,_timeFrame =

timeFrame

_timeFrame = CGRectMake(timeX, timeY,timeW,timeH);

timeFrame

//这样的话,第一个就创建好了,时间Label,创建好了,

2)计算头像的frame

我们看一下这个头像的Label,该怎么算,

头像

比如说,这是我们这个单元格,

单元格

1)首先,我们的时间,就是距离单元格左上角,就是0,0吧

时间

2)然后,注意,这个头像的Label,头像的这个大小,怎么算呢,

头像的大小,就等于,

头像的X,等于什么,

头像

头像的X,等于什么,我们先看头像的Y,等于什么,

头像的Y,就等于这个时间Label的最大的Y值,加上一个margin吧,

时间的Label的最大的Y值,加一个间距吧,

它的高和宽,假设都是30,高和宽,给它定义为30,

Y是距离上面这个控件,时间Label最大的Y值,加一个间距,

那么这个X呢,

当前,这个头像的X,等于什么,

屏幕的总宽度,减去这个间距,再减去它的这个宽度,这,是不是就是它的X啊,

宽度

3)那么如果说,这个消息,不是你发的,

是对方发的呢,那么这个头像的X,是不是就等于一个间距,就OK了,

头像

所以说,这个头像的X,头像的宽和高,都是30,头像距离上边的距离,都是这个时间Label的最大的Y值,加一个间距,

只有距离X的距离,要根据消息的类型,作判断,

OK,所以说,我们知道了,

//计算头像的frame

CGFloat iconW = 30;

CGFloat iconH = 30;

CGFloat iconY = CGRectGetMaxY(_timeFrame) +

//是不是间距,我们给它设置一个统一的间距,

间距

//设置一个统一的间距

CGFloat margin = 5;

间距

//这儿应该是_timeFrame吧,

timeFrame

CGFloat iconY = CGRectGetMaxY(_timeFrame) + margin;

这样

//这样的话,我们这个头像的宽、高、Y,是不是就有了,

//接下来,是不是要计算,头像的什么,X 吧,

CGFloat iconX =

//这个iconX,是不是取决于那个消息类型,消息类型,还是

//message == CZMessageMe ? 头像在右边 : 头像在左边 ;

//当前,我们在这个里面,在我们,

头像

//当前,在我们的这个frame模型的set方法中,message就是那个数据模型,

//数据模型中的type,CGFloat iconX = message.type,

type

//为什么“点”不出来,因为没有导入头文件吧,

#import “CZMessage.h“

导入

//数据模型里面的这个type,

type

//数据模型里面的这个type,== CZMessageTypeMe

type

//看看它是等于我自己吗,或者是等于对方吗,

对方

//如果是等于Other

CGFloat iconX = message.type == CZMessageTypeOther ?

//如果是等于Other,那么它这个间距,就等于一个margin啊,

CGFloat iconX = message.type == CZMessageTypeOther ? margin :

//如果这个消息类型,是对方,这个小黄人,那么,X就等于一个margin的间距,

margin

//如果要不是对方,是自己的话,就等于屏幕的宽度,减去一个margin,再减去一个头像的宽度啊,

//OK,否则的话,就等于屏幕的宽度,screenW - margin - iconW;

iconW

//这是不是就是我们这里的这个头像的宽、高、X、Y啊,

宽

//都有了,怎么办,_iconFrame吧

_iconFrame = CGRectMake(iconX,iconY,iconW,iconH);

icon

//这样的话,这个头像,是不是也算好了,

3)计算消息正文的frame

OK ,我们来看一下,这个消息正文,怎么来算,

宽

消息的正文的宽和高,因为消息的多少,我们是不是不确定啊,

消息的多少,我们不确定,所以说,消息的这个按钮的大小,取决于里面的文字,

我们首先要根据里面的文字,动态算一下,这个文字占多大,然后,这个当前这个按钮,的高和宽,是不是就是多大,

所以说,第一步,要拿到消息里面这个文字内容,根据文字内容,计算它的大小,

计算出大小以后,注意,如果说,这个消息是我们自己发的,

比如说,这个消息是,我们自己发的,

那么这个时候,它的X

X

比如说,这个消息,是我们自己发的,那么这个时候,它的X,就等于什么,屏幕的宽度 ,减去一个margin,再减去一个头像的这个宽度,再减去一个正文的宽度,这是不是就是X啊,

x

这就是X,

如果这个消息是对方发的,那么它的X,就等于一个margin,加上头像的宽度,然后这个地方,是不是我们的X,

X

注意,其实这儿是不是也可以再加一个margin啊,

这个地方,也可以再加一个margin,但是我现在不加这个margin,给大家看一下,

头像

我现在就假设,如果这个消息是对方发的,它的X就等于,一个margin,加上一个头像的宽度,

如果这个消息是我自己发的,那么它的X就等于,屏幕的宽度,减去一个margin,减去一个头像的宽度,再减去一个自己的宽度,

所以说,我们要计算它的X,必须得先算出这个正文的大小,才可以

好,那么所以我们,先算出这个正文的大小,

那么,假设这个正文的Y值,和这个头像的Y值,是一样的,

Y值

好,那么我们就先来算一下这个东西,

//1.先计算正文的大小

计算

好,计算正文的大小,还记得咱们昨天封装那个方法吗,

昨天咱们是不是有一个sizeWithText方法啊,根据文字调用那个字符串有一个叫boundingSize,那个方法,

bounding,那个方法,是不是就是根据字符串来计算它的大小的方法,

那么,我们发现,那个方法在很多地方,都会用的到,

所以说,我们想一下,把那个方法,昨天是不是给大家单独封装了那个方法,

今天我们不给它单独封装方法了吧,把那段代码给大家写一个类扩展,

还记得类扩展吗,

不是类扩展,分类,还记得分类吗,

分类,有一个作用,就是当这个类已经写好以后,

现在要给它加一个新的方法,但是不改原来的代码,

是不是可以使用分类来实现,

那么,我们就给大家,加一个分类,

把那个计算字符串大小的那个方法,写到分类里边,

来,看一看,

三、写一个分类,

1.好,我问一下,我们现在要给谁,写一个分类,

我们现在这个方法,的功能是,根据字符串,计算字符串要占用的大小,

所以说,是不是任何一个字符串,都有可能计算它的大小,

所以说,你的这个分类,给谁写更合适,是不是字符串啊,

因为任何一个地方,这个字符串,是不是都有可能计算它的大小,

所以说,我们就给字符串,写一个分类,

这个分类就是,用来计算这个字符串的大小,分类中封装一个方法,

根据字符串,计算它所占用的大小,的这么一个方法,

好,接下来,给字符串写一个分类,

2.写分类怎么写,还记得吗,

写分类

我的问题是,Others、Controllers、Views、Models,应该在哪里建这个分类啊,

它既不属于C、也不属于V、也不属于M,

不属于模型、视图、控制器的任何一部分,属于Others,

在Others里面,它既然是分类,那么就给它建一个New Group,

分类

分类的Group,Category,

Category

Categories,复数,

Categories

然后里面,新建

新建

新建一个File,

建分类

建分类,要选哪个,

Objective-C File,

分类

这个是一个Objective-C文件,

里面有可能是协议,有可能是分类,有可能是很多吧,

点它,点Next,

分类

这儿,选什么,

Category

分类,Category,

然后呢,这个分类的名称,就是啥啊,

分类

CZNSString的一个扩展Ext,Extension,

分类

这个分类的名字就叫,NSString的一个扩展,所以说,就是CZNSStringExt,

它是为这个字符串,建的一个分类,

分类

然后,点击Next,

分类

OK,这是不是就有这个分类了,

在这个分类中呢,我们可以给这个分类,是不是,

分类

分类中写两个方法,

1)一个是类方法,

2)一个是对象方法,

是不是都可以,

1)//对象方法

2)//类方法

类方法

1)对象方法,是以什么开头儿的,减号,-

-

减号

注意,这个分类,是不是就是,返回的也是一个字符串类型啊,

也是个字符串类型,所以说,我们这儿可以直接写instancetype,

- (instancetype)叫什么,

第一是一个对象方法,第二是一个类方法,

我们可以先把这个类方法,给它写一下,

+ (instancetype)

类方法

+ (instancetype)sizeWithText:(NSString *)

用户是不是得传一个字符串进来,

对象方法

因为这个对象,在调这个方法的时候,是不是还没有字符串啊,

传一个字符串过来,

+ (instancetype)sizeWithText:(NSString *)text

字符串

传一个字符串过来,然后呢,再传一个什么,maxSize:

maxSize

传一个,是否指定了最大值吧,maxSize:

+ (instancetype)sizeWithText:(NSString *)text maxSize:(CGSize)maxSize

这儿要导入头文件吧,

UIKit

是不是CGSize了,然后呢,还有什么,font:

font

+ (instancetype)sizeWithText:(NSString *)text maxSize:(CGSize)maxSize font:(UIFont *)font;

font

好,现在我们这个方法就是,sizeWithText,给我一个文本,再给我一个最大的大小,再给我一个字体,

我是不是在里面,就能给你算出它的大小来,

因为这个类里面,返回就是一个字符串,对吧,

噢,不好意思,这个地方,我们最后返回,应该是一个大小吧,

这儿应该是CGSize吧,

CGSize

+ (CGSize)sizeWithText:(NSString *)text maxSize:(CGSize)maxSize font:(UIFont *)font;

CGSize

我这儿想的是,返回一个对象自己了,

这儿应该返回的是CGSize,我们这个地方,应该返回的是CGSize,

因为我们最后,这个方法中,算出来的是一个大小吧,它不是字符串,

OK,现在这个方法有了以后,

2)然后,我们再看上面这个方法,该怎么写,

CGSize

//对象方法

- (CGSize)

注意,因为上面这个方法,这是一个对象方法,也就是说,这是字符串对象,是不是有这个方法,

所以说,这个地方,就不需要再写sizeWithText了,而是写一个sizeOfText,

sizeOfText

当前对象的文本,当前对象,本身就是这个文本吧,

然后呢,

- (CGSize)sizeOfTextWithMaxSize:(CGSize)maxSize

maxSize

然后是,font,

- (CGSize)sizeOfTextWithMaxSize:(CGSize)maxSize font:(UIFont *)font;

size

所以说,这个类方法,和对象方法,起名儿就要稍微注意一下,

类方法,就是sizeWithText,

你得给我传一个text,

我们在这个对象方法中,self自己,是不是就是这个文本啊,

就不需要再传了,

OK,接下来,我们实现一下这两个方法,

先给大家实现一下上面这个方法,

3)实现一下对象方法

OK,找到我们这个文件,NSString + CZNSStringExt.m

Size

//实现对象方法

- 减号,叫做……

减号

- sizeOf……

size
size

- (CGSize)sizeOfTextWithMaxSize:(CGSize)maxSize font:(UIFont *)font{

//在这个里面,直接return一个self

return self

//self自己,就是当前要计算的这个文本,self自己,就是这个文本,

//它里面,直接调bounding

return [self bounding……

文本
size

1)第一个参数:maxSize,就是maxSize,

maxSize

2)第二个参数:options,是不是我们传一个选项,

传一个NSStringDrawingOption吧

NSStringDrawingOption
NSStringDrawing

我们用这个,NSStringDrawingUsesLineFragmentOrigin,是一种计算方式,

3)第三个参数:attributes,这里是不是需要一个字典,@{}

字典,是不是要把这个字体,给它封装到一个字典里面,

font

在最前面写一个,

NSDictionary *attrs =

attrs

NSDictionary *attrs = @{}

字典

我们这里来个什么,来个

NSDictionary *attrs = @{NSFont

NSFont

NSDictionary *attrs = @{NSFontAttributeName };

font

NSDictionary *attrs = @{NSFontAttributeName:font};

font

OK,然后把这个attrs,传过来,

attrs

4)第四个参数:context,上下文,是不是给它传个nil,

nil

OK,

font

这样的话,我们是不是就可以直接返回这么一个size了吧,

然后,它“点”size,因为它

size

然后,它“点”size,因为它最后返回的是CGRect,然后,返回这个size,

OK,这是对象方法,

4)实现类方法

类方法,加号,+

加号

+ sizeWith……

size
size

+ (CGSize)sizeWithText:(NSString *)text maxSize:(CGSize)maxSize font:(UIFont *)font{

//在这个里面,我们是不是直接调用它的传进来的字符串啊,

text

text

调这个对象方法是不是就OK了,

[text sizeOfTextWithMaxSize……

size
size

1)第一个参数:maxSize,

size

2)第二个参数:font,

font

[text sizeOfTextWithMaxSize:maxSize font:font];

font
return

再把这个返回,这样的话,我们是不是就给我们的NSString,写了个分类,这个分类中,就封装了一个对象方法,封装了一个类方法,

这两个方法,都是根据字符串计算大小的方法,

好,有了这个分类以后,接下来,再找到咱们那个frame模型,

五、找到frame模型

frame

1.在frame模型中,是不是要计算正文的大小,

既然你要计算正文的大小,可以用刚才的分类,

既然你要用分类,所以说,先得怎么样,

NSString

先得把分类导进来,

导入

#import “NSString + CZNSStringExt.h“

2.把分类导进来以后,然后,计算正文大小,

//1.计算正文大小,

//这里来个,就是,

CGSize iconSize =

//等于什么啊,等于当前message

message

//等于当前message,是不是数据模型,

//数据模型里面,“点”text

text

//数据模型里面,“点”text,是不是当前这个正文的内容吧,

//调用这个text的一个叫sizeOfTextWithMaxSize的方法,

sizeOfText
方法

我这儿写了什么,icon了,应该是正文吧,textSize,正文的Size

text

CGSize textSize = message.text sizeOfTextWithMaxSize:(CGSize) font:(UIFont *)

正文的Size,等于message.text sizeOfTextWithMaxSize:(CGSize) font:(UIFont *)

我们这里正文,注意,正文,需要指定高吗,

需要设置高

正文,需要指定高吗,

正文,高不需要指定,但是宽,是不是得指定一下,宽假设是200,

宽

CGSize textSize = message.text sizeOfTextWithMaxSize:CGSizeMake(

CGSizeMake

宽,假设是200,

CGSize textSize = message.text sizeOfTextWithMaxSize:CGSizeMake(200,

size

高,我们是不指定,叫什么,MAXFLOAT,

MAXFLOAT

CGSize textSize = message.text sizeOfTextWithMaxSize:CGSizeMake(200,MAXFLOAT) font:(UIFont *)

然后呢,font呢,font,我们是不是要指定一下,

font,我们可以指定一个宏吧,

因为等会儿,是不是,你这里正文指定是用多大的字体,来算,

我们这个Label里面,

Label

Label里面,也应该是多大字体,

所以,我们这里要写一个宏,但是这个宏,为了等会儿能一起来使用,我不把这个宏,写在.m文件中,

m文件

把这个宏,写在哪里,.h文件当中,

h文件

#define macro

macro

#define macro ,叫什么,

叫做正文的font,textFont,

正文的font

#define textFont

我们这里得先写一下,在.m文件里面,

UIFont

[UIFont

systemFont

[UIFont systemFontOfSize:(CGFloat)

CGFloat

正文,给它来个多大,来个14吧,

size

[UIFont systemFontOfSize:14]

然后,选中它,command + X

选中

回到.h文件里面,再command + V

粘贴

OK,好,textFont有了,

textFont

有了这个以后,我们回到.m文件里面,

我们在这个地方,就可以直接把

直接把

直接把这个传进来,

textFont
textFont

好,这样的话,我们是不是根据这个text、指定的字体大小,算出这个正文的大小来了,

注意,既然你正文是根据这么大的字体来算的,

textFont

所以说,打开我们这个自定义Cell,

打开我们自定义Cell这个类,

自定义Cell

我们创建好这个正文的Label以后,是不是要设置一下正文的字体大小啊,

//设置正文的字体大小,

//怎么设置正文的字体大小,

正文

btnText……

btnText

这个font能用吗,

是不是建议已经过时了,所以说,应该怎么写,

它里面,是不是有

titleLabel

它里面,是不是有个叫作titleLabel吧,

titleLabel

titleLabe的font

font

这么来设置啊,

font

是这么来设置的

textFont

btnText.titleLabel.font = textFont;

先拿到里面titleLabel的font,然后再设置它的字体,

这样的话,我们就设置完这个正文的字体大小了,

当然,我们计算的时候,是不是也是根据这个字体来算的,

计算

我们有了这个以后,正文的宽,textW =

textW

CGFloat textW = textSize.width;

textW
textSize

正文的text高,textH =

height

CGFloat textH = textSize.height;

正文

好,现在正文的宽和高有了,接下来,是不是要计算正文的X和Y了,

3.计算正文的X和Y,

注意,正文的X,我们再看一下,

正文的Y,先看正文的Y吧,

正文

正文的Y,我们说,假设正文的Y和这个icon是一样高的吧,

正文

有人说,这儿明明看起来不是一样高啊,

咱们这点儿间距,是因为,这个其实是一样高的,

因为咱们设了这个背景图,所以说,看起来有点儿差距了,

你这儿看起来,他俩不一样高,是不是看到这个背景图和它不一样高,

是因为按钮里面的背景图,事实上,这个按钮的Y值,和这个icon是一样高的,

所以说,我们这里的正文的什么,正文的Y,就等于icon的Y,

CGFloat textY = iconY;

正文

正文的X,这里就要判断了,正文的X,

如果这个消息是对方发的,那么它的X,就等于一个,等于这个icon的最大的X吧,

最大的X

icon的最大的X,给它加一个margin也行,那么这里我假设就不加了,让它俩紧贴住,但是紧贴住以后,等会儿你看出来,也不会紧贴的,因为有背景图,

所以说,这里假设,如果消息是对方发的,就让它的X等于margin , 加上一个,就等于这个正文的最大的X值,额,等于这个icon的最大的X值,

margin

如果这个消息是自己发的,

那么它的X就等于屏幕的宽度,减去一个margin,再减一个头像的宽度吧,再减一个正文的宽度,

正文

来,算一下,

CGFloat textX = message.type == CZMessageTypeOther ? CGRectGetMaxX(_iconFrame) : screenW - margin - iconW - textW;

textX

CGFloat textX 等于,我得先判断消息类型,messageType ==

消息类型

得先判断消息类型,CGFloat textX = message.type == CZMessageTypeOther

如果要是Other

如果要是Other,如果要是对方的话,那么看一下,

CGFloat textX = message.type == CZMessageTypeOther ?

如果要是对方的话,那么它就等于什么,

对方

等于icon的最大的X吧,

直接等于icon的最大的X,这儿怎么写,

icon

CGFloat textX = message.type == CZMessageTypeOther ? CGRectGetMaxX(CGRect rect)

rect
iconFrame

等于iconFrame,是不是最大的X值啊,

iconFrame

如果要是不是对方,是自己发的

对方

如果是自己发的,那么就等于屏幕的宽度,减margin,再减icon的宽度,再减正文的宽度,

正文

你说是这个吗,这个小尖尖,

正文

告诉大家,这儿怎么减,

等于屏幕的宽度,减去这个margin,再减去头像的宽度吧,再减去正文的宽度,

正文

就可以了,等于屏幕的宽度,减去这个margin,再减去头像的宽度,再减去正文的宽度,

来,看看这儿怎么写,

宽度

来,看一下怎么算,等于屏幕的宽度,减去一个margin,再减去一个icon的宽度,再减去一个自身的宽度,(screenW - margin - iconW - textW)

这是不是就是它的X啊,

x

来,算完以后,怎么办,

算完

正文的frame , _textFrame =

正文

正文的frame,等于CGRectMake

_textFrame = CGRectMake(textX,textY,textW,textH);

正文

OK,这样的话,这几个是不是都算好了,

现在呢,我们正文的,这些frame也算好了,

接下来,是不是该算行高了,

四、行高,

行高

1.这个行高,怎么算,

行高

行高,是不是还是取到最后一个控件,加一个margin,

如果说,当前最后一个控件,是一个正文的话,

正文

如果说,当前最后一个控件是正文的话,那么这个行高,就等于这个正文的最大的Y值,加一个margin,

正文

如果说,比如说,当前是个头像比较大,有时候,如果它就一行,

一行

这个时候,头像如果比这个正文还高,那么这个时候,我就用头像的最大的Y值,加一个margin,

头像

有人说,看起来好像,每次都是这个正文更高一些,

看起来好像每次都是这个正文,正文在下面,是不是高度在这儿,

高度

头像是不是高度在这里,

头像

好像,每次这个正文,都比这个头像高一点儿,

但是,一旦我设置这个头像大点儿,设置这个正文字体小一些,这个时候,有可能,头像的高度,比如说,你就发俩字儿“不错”,

这个时候,有可能头像的高度,就会比这个正文的高度高,头像的Y值,就有可能比正文的Y值,高,明白,

所以说,我们这儿,怎么判断呢,我要先判断一下,拿到这个头像的最大的Y值,和正文最大的Y值,看一下它俩谁的值大,

我就取谁的值,然后用这个值,加一个margin,

我这里,单元格的高度,等于什么,

单元格的高度,等于

1)拿到头像的最大Y值

2)拿到正文的最大Y值

3)看这两个最大Y值,哪个最大Y值更高一些、更大一些,

4)我就用这个值,加一个margin,

这就是单元格的高度,就是行高,

思路

这儿的思路就是干什么,

1)//获取头像的最大的Y值和正文的最大的Y值

2)//然后用最大的Y值 + margin

margin

这就是我们这里所说的这个行高,

CGFloat maxY = 有个宏,叫

宏

宏,叫MAX(A,B)

在宏里面,

max

在宏里面,拿到CGRectGetMaxY

宏

获取当前这个

textFrame

获取当前这个正文的最大的Y值,

textFrame

3)然后呢,再获取头像的最大的Y值,

拷贝

拷贝过来,再拿到我们的iconFrame,

icon

注意看,这个MAX是一个宏,

这个宏内部,就是比较你传过来的第一个值,和第二个值,

这两个值,谁大,这个MAX就把这个大值返回,

来,按住command键,点MAX,

宏

这,我们就是这个宏吧,这个宏,内部,是不是调了这一堆东西啊,

就是,记住,这就是一个宏,

宏

这个宏内部,就是把你传过来的这个值,

值

和这个值,作一个比较,

宏

这两个值,哪个值大,就返回哪个值,

OK,然后,我这里就让当前下划线rowHeight等于它,

行高

_rowHeight = maxY + margin ;

让这个行高,等于我们最大的Y值,加一个margin,

这就是拿到了我们这个行高,

行高

这就是拿到了,我们当前这个最大的这个行高,

根据是正文的最大的Y值,还是icon最大的Y值,加一个margin,这就是行高,

好,那么到此为止,我们在这个frame模型里面,每一个子控件的frame,

frame

和它的行高,是不是都算好了,

行高

这样就都算好了,

好,这些都算好以后,我们看一下,再找到我们控制器,

控制器

控制器里面,数据有了,

数据源有了

数据源方法,也都实现了,

数据源

接下来,我们一运行,是不是就应该能看到那个效果了,

OK,写了半天,是不是就没有运行过啊,

运行

来,看一下,那么现在,我们基本上,这个内容,是不是显示出来了,

但是,第一,这个状态栏,太恶心,把它去掉,

第二,正文,也看到了吗,然后呢,这个Label,文字,是居中的吗,

不是吧,咱们接下来,把这些一个一个调整一下,就OK了,

4.第一,我们先把这个状态栏去掉,怎么去掉,

状态栏

- (BOOL)prefersStatuesBarHidden{

return YES;

}

YES

好,这是第一个,状态栏没了,

5.第二个,是不是要让它这个Labe的文字,变成,14是不是太大了,

label

把Label的文字,变成12,然后让文字居中,

我们在这个frame模型当中,计算时间的时候,

frame

我们这个时间,是不是没有给它设置大小吧,

我们计算时间的Label大小,是不是也是直接指定的,

指定

也没有根据文字大小来计算,对吧,

所以,我们这里,不需要看它,

只是需要在创建好这个Label的时候,指定一下时间Label的文字是12,并且让文字居中,

好,修改一下细节

7.找到我们的自定义Cell,

自定义Cell

创建好Label以后,

Label

设置Label的文字,

//设置Label的文字,怎么设置,

lblTime.font = [UIFont systemFontOfSize:12];

lblTime
font

lblTime.font =

UIFont
font
font

给它来个12,

font

8.设置文字居中,

//设置文字居中

lblTime

font

怎么设置文字居中,

lblTime.text……

text

lblTime.textAlignment

text

lblTime.textAlignment,这个就是设置文字居中,设置文字对齐方式,

是一个枚举,NSTextAlignment

text

是一个枚举,NSTextAlignment,

text

注意,哪个是居中,是不是Center啊,

center

Center就是居中吧,

lblTime.textAlignment = NSTextAlignmentCenter;

Center

设置完这个以后,我们再运行一下,

运行

状态栏没了,文字是不是居中了,

8.然后看,正文,有吗,

没有,点一下,

点一下

有吗,有,看到了吧,也就是说,因为按钮的文字,默认是不是白色的啊,看不到啊,所以,我们首先把按钮的文字,给它改一下,改成我们能看到的,

先让它看到再说,

找到我们自定义Cell里面,创建正文按钮的地方,修改按钮的正文的文字颜色,

文字颜色

//修改按钮的正文文字颜色

text

怎么设置正文文字颜色,set……

set

btnText set ……

btnText setTitle……

setTitleColor

btnText setTitleColor,这个不能直接用textColor,因为它不是Label,

textColor

因为它是不是分不同的状态的颜色啊,

setTitleColor

btnText setTitleColor : (UIColor *) forState:(UIControlState)

状态

来一个什么,UIColor……

Color

UIColor,来个redColor,

redColor

先给它来个红色,

Normal

UIControlStateNormal,

Normal
Normal

好,command + R,

Normal

看,是不是这个正文,能看到了吧,

但是,你看,正文这么多,是不是只显示这几个,也就是说,正文没有怎么样,正文是不是没有换行吧,

是不是没有换行,

接下来,我们要让,这个正文的Label,是不是可以换行,

正文,首先它,是一个按钮,要让按钮里面这个Label,文字可以换行,

9.让按钮里面的Label文字可以换行,

Label

//设置按钮中的Label的文字可以换行,

//怎么写呢,

btnText……

btnText

让它,“点”,它,btnText.titleLabel,

titleLabel

titleLabel,这是不是正文里面的Label,

titleLabel

怎么让它Label可以换行,有个属性叫number……

numberOfLines

btnText.titleLabel.numberOfLines =

numberOfLines

等于0,是不是就可以换行了,

numberOfLines

btnText.titleLabel.numberOfLines = 0;

command + R,走一个,

换行

看,是不是可以换行了,这样的话,就可以换行了,

好,现在的话,我们基本上这个文字数据,是不是能显示出来了,

那么当然还有一些很恶心的地方,把那细节调整一下就OK了,

现在基本上我们就是这个

1)计算坐标,已经OK了,

2)文字,已经能显示出来了,

接下来,我们就把细节,再调整一下,

好,我们计算坐标,就先说到这儿,大家休息一下吧,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风清晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值