【QQ界面展示-细节调整 Objective-C语言】

一、刚才我们已经做到这个状态了

文字

1.刚才我们做到这里了,就是文字可以显示出来了,

基本数据给大家加载了,然后我们再把这个美化一下,再把这个时间处理一下,

2.咱们先把它这个效果稍微美化一下吧,怎么美化呢,来看一下,

首先,我们看一下示例程序,实际程序,中间是没有这个分割线的吧,

示例程序

怎么取消这个分割线呢,

是不是UITableView,有一个属性,叫做separatorStyle啊,

分割线的样式,None,是不是就没有分割线了,

找到控制器,在控制器的viewDidLoad里面,

viewDidLoad
self

self点什么,tableView,这里能点儿出来tableView吗,点儿不出来,表示什么,需要拖线吧,拖线用一个属性来引用啊,

分割线

这样是不是就取消掉分割线了,

分割线

分割线没有了,

3.然后我们再看一下,这个UITableView是不是有个背景色啊,

背景色

这个背景色,灰色的一个背景色吧,来,给它设个背景色,

背景色

这个背景色,用(236,236,236),

//设置UITableView的背景色,怎么设置

self.tableView.backgroundColor =

//注意,这个backgroundColor,它是一个简单的红色、蓝色、这个预定义的颜色吗,不是,是一个236组成的颜色,(236,236,236)

//这时候,我们得用哪个,UIColor colorWithRed:(CGFloat) green:(CGFloat) blue:(CGFloat) alpha:(CGFloat)

//吧

//ColorWithRGB吧,注意,ColorWithRGB这个地方,我们是不是得给它三个值,我们说,每一个颜色,是不是都是0到255的一个颜色啊,

//这个地方,我们不能直接写个236,

236

//不要这么写,写个236.0

//或者直接写一个236 / 255.0

236

//这样的话,每一个颜色是不是都是一个百分比,这里都是一个百分比,不是一个写死的颜色,green也是一个百分比,236 / 255.0,blue也是一个百分比,236 / 255.0,后面这个alpha,是否透明,我们这里不透明,是1.0

百分比
看到

但是,看到背景颜色了吗,

没有,滚一下,看到了吗,

颜色

看到了吧,后面,但是当有单元格的时候,看不到这个背景颜色,

为了能有单元格的时候,也能看到这个背景颜色,所以说,我们把单元格的背景色,给它设成一个没有背景色,

把单元格的背景颜色,设成clearColor,

4.修改单元格的背景颜色,

找到我们这个单元格,

单元格

这是我们的单元格吧,

单元格,在创建好这个单元格的时候,设置单元格的背景颜色,

单元格

怎么设置呢,self是不是单元格自己啊

self.backgroundColor =

self
color

self.backgroundColor = [UIColor clearColor ] ;

color

看到背景色了吗,

6.现在每一行,一点,是不是高亮显示了,

高亮

不想要这个效果,是不是让行不允许被选中吧,怎么做,

也得设置UITableView,让它的行不允许被选中,

找到控制器,找到viewDidLoad,

//设置UITableView的行不允许被选中

不允许

self.tableView.allowsSelection = NO;

5.现在每一条消息的发送时间,是不是都显示出来了,

时间

但是,事实上,看一下示例程序

消息

你发第一个消息的时候,有时间, 第二个,有时间,第三个,有时间,第四个,有时间,第五个、第六个,和第四个,是不是都是在8点07分发的,同一分钟发了三个消息,或者说你们一直在聊,这个时候,这个时间就不需要显示了,

当下一条消息的发送时间和上一条消息的发送时间一样的时候,是不是吓一条消息的发送时间,就不显示了,

那么这个思路该怎么实现呢,我们要的是当我们下一个消息、当前这一条消息发送时间,如果和上一条消息的发送时间一样了,那么这个时候,当前这条消息的发送时间,是不是就不显示了,

找到我们自定义单元格里面,设置数据的时候,

设置

这里设置时间的时候,可以判断

当前这个消息的时间,和上一个消息的时间,是不是一样,

如果一样,就隐藏当前这个Label,如果不一样,就显示这个Label,

在这里,我们通过这个message.tIme,可以拿到当前这个消息的时间,但是,你在这里能拿到上一条消息的时间吗,在这里单元格里面,是不是只能拿到当前这个数据模型啊,

数据模型

拿不到上一个单元格的数据模型,

所以说,我们解决办法就是,在懒加载的时候,判断当前这个单元格的、这条消息的发送时间,和上一条消息的发送时间,是不是一样,在那个地方判断,因为我们只有在懒加载的时候

懒加载

只有在懒加载的时候,我们是不是可以拿到当前这个数据模型

同时,也可以拿到这个arrayModels .lastObject,

arrayModels

也能拿到它上一条数据模型吧,

只有在懒加载的时候,才能拿到当前的数据模型,和上一条数据模型,

但是,你在懒加载里面,是可以拿到这两个数据模型,你把这个数据模型,判断,作一个判断,当前这个数据模型.time,和上一条数据模型.time,是否一致,如果一致的话,你是不是得把这个值给记录下来啊,

是否一致,你把这个BOOL得记录下来,

记录下来以后,然后,在单元格这个地方,

单元格

你就可以判断,这个BOOL类型的值,然后,决定这个单元格是否是隐藏,决定这个lblTime这个Label,是不是需要显示吧,

所以说,我们的基本思路就是:

1)在懒加载的时候,判断当前这个模型的时间,是不是和上一个模型的时间,是否一致,

判断

注意看一下,我们这里判断一下,

//判断当前模型的消息发送时间,是否和上一个模型的消息发送时间一致,

模型

如果一致,做个标记

判断

if(condition),注意,当前模型,这是不是当前的数据模型啊,当前数据模型,有一个time,

model

if(model.time

当前数据模型,有一个time,is,因为它

isEqualToString

因为它是一个字符串,对吧,字符串,能直接用等号判断吗,

等号是判断对象地址,是否一样吧,

怎么判断两个字符串是否一样,isEqualToString吧,

和谁呢

isEqualToString

和上一个模型的时间,怎么获取上一个模型,

//获取上一个数据模型,

获取上一个数据模型

CZMessage

获取上一个数据模型

获取上一个数据模型,

CZMessage *lastMessage =

lastMessage

CZMessage *lastMessage = arrayModels

arrayModels

CZMessage *lastMessage = arrayModels lastObject

lastObject

是不是获取上一个的一个frame模型了,

CZMessage *lastMessage = [arrayModels lastObject];

获取上一个的一个frame模型了,“点”什么,“点”message,

在这里插入图片描述

为什么“点”不出来,或者直接调message

message

这是不是就是获取

获取

这是不是就是获取上一个frame模型里面的这个message对象了,

OK,这是不是有一个警告,

警告

告诉你指针类型不兼容吧,

指针类型不兼容

指针类型不兼容,

这个怎么办,是不是强转一下,

强转

CZMessage *lastMessage = (CZMessage *)[[arrayModels lastObject] message];

注意看,为什么是最后啊,因为我,大家是不是认为,lastObject,是不是获取当前最后一个模型,我现在是,当我要一个新模型的时候,这里创建一个模型对象,

创建

1)首先,创建一个新的模型对象,数据模型对象,

2)然后,创建一个新的frame模型对象,

frame模型对象

3)然后,把这个数据模型,设置给这个frame模型,

设置

4)然后,在这句话的时候,才是把刚刚创建的frame模型加到这个集合里面,

集合

也就是说,在你没有执行这句话的时候,当前集合里面,最后一个对象,是不是就是上一条模型,

上一条

所以说,这就是lastObject是拿到当前上一条模型,

上一个模型,因为新的模型,还没加进来呢,

这是不是最新的模型,modelFrame,当执行到这句话的时候,

[arrayModels addObject:modelFrame];

最新的模型,才加进来了,

所以说,在没有执行这句话的时候,这个集合中的lastObject,就是上一个模型,这才是当前最新的模型呢,modelFrame,

所以说,我们这里,拿到上一个模型中的数据模型,

CZMessage *lastMessage = (CZMessage *)[[arrayModels lastObject ] message];

然后呢,这个数据模型,什么,lastMessage.time,

time

lastMessage.time,判断,就是

判断

判断,就是上一个模型的发送时间,和当前的发送时间是不是一致,

1)如果一致,是不是要做一个标记,这个标记,做到哪儿呢,

这个标记,我就做到这个数据模型里面,

注意,我在数据模型里面,

数据模型

我在数据模型里面,这个时候,再加一个属性,

//用来记录是否需要显示“时间Label“

BOOL

//那么,这个就是一个BOOL值,是否,就是hideTime

隐藏

//hideTime,是否需要隐藏时间吧,

//注意,我把这个是否需要隐藏时间,把它写到了什么里面,是不是把它写到了我们这个CZMessage数据模型里面吧,

message

//好,然后在控制器里面,怎么写呢,

这里写

//我这里写,如果说,当前这个模型的时间,和上一条记录的模型的时间,是一样的,我就让当前这个数据模型的hideTime = YES

YES

//是不是让它等于YES啊,

2)否则,就让它等于什么,NO吧,

else {

model.hideTime = NO;

}

NO

但是,这个是不是不写也行啊,

因为我们这个模型,默认情况下,是不是BOOL类型,就是NO啊,

NO

所以这个,是可以不写的,

好,那么这就是我们在懒加载的时候,根据当前模型的时间,和上一条数据模型的时间,判断是不是应该隐藏当前Label,

既然你在这个模型中,都有这个标记了,

所以说,接下来,在我们自定义单元格里面,

Label

在这个地方,我们就可以直接让当前单元格的这个

lblTime

时间Label的hidden,等于数据模型里面的

hidden
hideTime

self.lblTime.hidden = message.hideTime;

如果说,当前这里是需要隐藏时间,它返回是不是YES啊,

YES

YES给了hidden,当前Label是不是隐藏了,

如果当前不需要隐藏,hideTime,是不是NO,NO给了hidden ,当前Label是不是显示出来了,

明白了吗,

然后我们再运行的时候,看一下是不是每个时间都显示出来了,

Label

看一下,这个时间显示了吗,是不是第一个这个时间有,这个时间和这个时间没有显示啊,

9.既然这一条消息的时间Label都没有显示,这儿的距离是不是应该小一些啊,

但是现在没有显示时间,距离是不是还是很大,

也就是说,计算这个正文的Label,计算正文的坐标,计算正文和这个icon坐标的时候,是不是还是把那个时间的坐标给它算上了,

所以说,我们还得改一下,在计算这个正文和这个icon的Y值的时候,是不是不要,如果说这个Label,如果说这个时间隐藏了,是不是就不要根据它的时间Label来算了,

来看一下,把这个间距再调一下,间距是不是在我们frame模型里面,

在这里来设置的吧,

设置

OK,我们这里就是计算时间Label,

我们可以这么来写,if(

如果

如果,当前这个数据模型“点”hideTime

hideTime

如果需要隐藏的话,

hideTime

if(message.hideTime){

//statement;

}

如果它不需要隐藏,如果当前时间Label不需要隐藏,

if(!message.hideTime){

//statement;

}

hideTime

如果当前时间Label不需要隐藏,那么,此时,你再给它算一下这个frame的值,

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

if(!message.hideTime){

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

}

在这里插入图片描述

如果说,当前时间Label需要隐藏,这个时候,还有必要计算它的frame值吗,是不是不需要算frame值了,

既然你frame值不需要算,后面根据frame,算出来值,是不是都是0了,

frame

//如果需要显示时间Label,那么再计算时间Label的frame,如果不需要显示时间Label,就不算它的frame了,既然你都没算它的frame,那么根据frame,拿到的这个Y值,最大的Y值,最大的X值,是不是始终都是0,

始终

运行看看,

运行

来,我们看怎么给它算一下,我把这个时间Label,给它设置一个背景色吧,

给它截个图看一下,

这是不是我们现在这个情况啊,

现在

这是我们现在这个情况,给它保存一个图片,

保存

然后,我把这句话再,

保存

这句话,拷出来,

拷出来

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

截图
没变化

是不是没啥变化啊,都没变化哈,

来,证明咱们这儿,是不是没有起作用,

我们这里,是不是显示时间,是不是这么给它算的啊,

显示时间

如果这么写不行的话,那我就不这么写了,

我先把这个注释掉啊,

注释掉

我下面这么来做,无论你这个Label是不是需要显示,Label这个值,我正常给它计算,

然后,下面计算头像的时候,这个Y值,我在这里来给它算Y值,

Y值

如果说,当前message.hideTime,

if(message.hideTime){

//如果它需要隐藏时间的话,如果说时间Label需要被隐藏的话,

//这个时候,我就让iconY = 0;

iconY = 0;

}

这样的话,头像的Y值,是不是就是根据

头像

这样的话,头像的Y值,是不是就是根据0来算的了,

既然头像的Y值,是0,那么正文的Y值,是不是也是根据头像的Y值来算的,

头像

我刚才本来我想的是,如果说这个时间Label,如果要是不需要隐藏的话,我就来计算时间Label的frame值,

时间Label

如果,时间Label需要隐藏,我就不计算时间Label的frame值,

然后呢,咱们刚才试了一下,好像是没有什么效果,

那么如果没有什么效果,我就这么来算,

如果

如果说,当前这个时间Label需要被隐藏,

如果说,时间Label不隐藏,那么我这个icon的Y值,是不是就等于时间Label最大的Y值,加一个margin啊,

时间

如果这个时间Label需要隐藏,这个时候,就没有时间Label,那么我们这个时候,icon的Y值,就等于紧贴住我们单元格的Y值啊,

时间

紧贴住单元格内边距,Y值就等于0了,

时间

再运行看一下,

时间

如果这样不行的话,就是咱们刚才哪儿写的不对,

这时候,是还不行吧,

这时候还不行,肯定是咱们刚才哪儿写错了,证明就不是刚才这个写错了的问题,

证明

来,看一下,咱们是哪里有问题了,

我们看一下,刚才是不是设置上有问题,找到控制器的懒加载这里,

时间

1)首先,创建一个新的数据模型,

2)新的模型里面,这里,拿到了这个frame模型,

3)计算,让它的hideTime等于YES,

这个时候,咱们在单元格这个地方,咱们打印一下这个hideTime吧,

时间

不在这里打印,咱们在这个frame里面,

我知道哪儿错了,大家知道哪儿错了吗,看这里,

找到控制器的懒加载这里,

时间

我刚才,这是不是那个数据模型的set方法,

数据模型的set方法,在这个地方,按住command键,点message,跳到下面这个地方,

时间

在这个地方,

数据

在这个地方,我是不是要使用这个数据模型里面这个hideTime这个属性吧,

hideTime

要使用数据模型的这个hideTime这个属性,

但是我这个hideTime,是在什么地方算出来的,

是不是在控制器里面,是不是在你设置完以后,是不是在这里给它赋的值啊,

赋值

明白这个错误了吗,我是不是应该把这句话怎么办,把这两句话,调整到,

调整

调整到它前面啊,

是不是应该调整到这个地方啊,

调整

因为我是在刚才,我这里是不是我们这个set方法啊,

set方法

我们这里是把数据模型,设置给这个frame模型,

是在这里计算的,我们应该在执行set方法之前,是不是就应该为这个模型的hideTime赋值,

时间

应该在执行set方法之前,就给hideTime这个属性赋值,

来,我们把这个干掉,

删掉
刚才

刚才咱们这么写,其实是没有错的,

解开注释,

时间

这个是不是就不需要了,

下面这个是不是也不需要了,

时间
时间

这样是不是明显窄了吧,

我再解释一下是怎么回事儿啊,

1)我们在这个frame模型的set方法当中,

frame模型

我们在这个frame模型的set方法当中,是不是要用这个数据模型的hideTime这个属性,

2)所以说,我在这个控制器里面,在你设置

在你设置这个模型的时候,

调用set方法的时候,

1)首先,是不是得把这个数据模型的hideTime这个属性,是不是得给它设一个值,

时间

设一个值,然后再执行这个set方法的时候,

时间

才会用到这个值啊,

这样的话,我们就是frame计算好了,背景色设置好了,然后,时间Label是否隐藏,也设置好了,

间距如何隐藏,间距要窄一些,这儿,也设置好了,

时间

这就是我们这儿说的这么一个东西,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清风清晨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值