上节课我们完成了原创微博的界面调整,这节课我们要完成转发微博的一些调整,以及搭建完整的微博工具条。用到的思想和方法也和前面没有什么大的不同,原理上是一样的。
本节内容
- 修改转发微博昵称显示
- 搭建微博工具条
本节资料代码
14.1 修改转发微博昵称显示
我们上节课做的转发微博只是显示了昵称,但实际微博会在昵称前面加上一个“@”,这里我们就要思考怎么把“@”添加到昵称前面。我们先做一次尝试,如果在YGRetweetView内的setStatusFrame方法内就把“@”加到昵称前面会是什么效果。代码如下:
NSString *retweetName = [NSString stringWithFormat:@"@%@",status.retweeted_status.user.name];
_nameView.text =retweetName;
效果如下:
可以看到,昵称也没有显示完整。原因就根上节课处理时间的情况一样,也是因为一开始nameView的frame就被写死了。
那我们就转而就想试试之前处理时间的方法来处理nameView,可是当你分析代码后发现,如果把计算转发微博的昵称的代码搬走了,转发微博正文的代码也要搬走才能正常显示,因为转发微博正文的Y值是依赖于昵称frame大小。而且cell的高度也是依赖于正文的frame,把昵称frame搬走了,想在MVVM计算cell的高度的愿望也就不能达成了,这样一想我们这条路目前不太好走。
而且我们试验的效果如下图:
如果想重写YGUser内name的get方法,这样也不容易判断用户是转发微博的用户,还是原创微博的用户。
所以该想的我们都想了,该怎么办呢,遇到这个问题新人是真的不太好走了,只能依靠有经验的开发者传授秘籍啦。传授的秘籍就是,在YGStatus的模型内添加一个专门的转发微博昵称属性,然后重写setRetweet_Status方法,在这里拼接字符串,并且赋值给retweetName 属性。代码如下:
- (void)setRetweeted_status:(YGStatus *)retweeted_status
{
_retweeted_status = retweeted_status;
_retweetName = [NSString stringWithFormat:@"@%@",retweeted_status.user.name];
}
并且在YGStatusFrame视图模型内根据这个新的retweetName来计算_retweetNameFrame大小。
在YGRetweetView的setStatusFrame方法内,给_nameView也赋上新的retweetName属性。
最后别忘了在setUpAllChildView方法内更改转发微博字体颜色为蓝色。
14.2 搭建微博工具栏
搭建微博工具栏的步骤就与原创微博类似了,这里因为也要设置其背景图片,所以也要把继承的类改为UIImageView。代码如下:
- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
// 添加所有子控件
[self setUpAllChildView];
self.userInteractionEnabled = YES;
self.image = [UIImage imageWithStretchableName:@"timeline_card_bottom_background"];
}
return self;
}
这里我们也抽取了一个添加所有子控件的方法。代码如下:
- (void)setUpAllChildView
{
// 转发
UIButton *retweet = [self setUpOneButtonWithTitle:@"转发" image:[UIImage imageNamed:@"timeline_icon_retweet"]];
_retweet = retweet;
// 评论
UIButton *comment = [self setUpOneButtonWithTitle:@"评论" image:[UIImage imageNamed:@"timeline_icon_comment"]];
_comment = comment;
// 赞
UIButton *unlike = [self setUpOneButtonWithTitle:@"赞" image:[UIImage imageNamed:@"timeline_icon_unlike"]];
_unlike = unlike;
//添加分割图片
for (int i = 0; i < 2; i++) {
UIImageView *divideV = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"timeline_card_bottom_line"]];
[self addSubview:divideV];
[self.divideVs addObject:divideV];
}
}
在这个方法里 因为也要设置每个按钮的内容,所以又抽取了一个设置单个按钮的方法:
- (UIButton *)setUpOneButtonWithTitle:(NSString *)title image:(UIImage *)image
{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setTitle:title forState:UIControlStateNormal];
[btn setImage:image forState:UIControlStateNormal];
[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
btn.titleLabel.font = [UIFont systemFontOfSize:12];
btn.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 0, 0);
[self addSubview:btn];
[self.btns addObject:btn];
return btn;
}
如果你这时候运行项目的话,会发现按钮是显示不出来的,因为我们没有设置每个按钮的位置和大小,所以我们重写layOutSubview方法如下:
- (void)layoutSubviews
{
[super layoutSubviews];
// 设置按钮的frame
NSUInteger count = self.btns.count;
CGFloat w = YGScreenW / count;
CGFloat h = self.height;
CGFloat x = 0;
CGFloat y = 0;
for (int i = 0; i < count ; i++) {
UIButton *btn = self.btns[i];
x = i * w;
btn.frame = CGRectMake(x, y, w, h);
}
int i = 1;
for (UIImageView *divide in self.divideVs) {
UIButton *btn = self.btns[i];
divide.x = btn.x;
i++;
}
}
这个时候我们的微博工具条才开始像样了,但是又没有发现我们把按钮上的文字给写死了,如果转发有200条,我们这里就没发显示出来。所以我们就要把YGStatus模型里的三个数值:转发数,评论数,点赞数传递给YGStatusToolBar上的按钮,传递方法就是给YGStatusToolBar添加一个外部YGStatus属性。别忘了在YGStatusCell 的setStatusFrame里把视图模型里的模型传递给YGStatusToolBar。
_toolBar.status = statusFrame.status;
然后我们就可以在重写setStatus方法了,在里面把那三个数字赋值给各自的按钮:
- (void)setStatus:(YGStatus *)status
{
_status = status;
// 设置转发的标题
[self setBtn:_retweet title:status.reposts_count];
// 设置评论的标题
[self setBtn:_comment title:status.comments_count];
// 设置赞
[self setBtn:_unlike title:status.attitudes_count];
}
因为每个按钮都要设置内容,这里我们专门抽取了一个方法来设置数值,内部代码如下:
// 设置按钮的标题
- (void)setBtn:(UIButton *)btn title:(int)count
{
// > 10000 10100 1.2W
NSString *title = nil;
if (count) {
if (count > 10000) {
CGFloat floatCount = count / 10000.0;
title = [NSString stringWithFormat:@"%.1fW",floatCount];
//1.0w 显示成1w
title = [title stringByReplacingOccurrencesOfString:@".0" withString:@""];
}else{ // < 10000
title = [NSString stringWithFormat:@"%d",count];
}
[btn setTitle:title forState:UIControlStateNormal];
}
}
因为有时候数值会很大,如果你经常玩微博就会知道,那些明星的微博的转发和评论量都是过万的,这里我们就要把过万的数字显示成X.Xw。在实际开发中,你可能不会立马想到抽取代码,而是先写好某一个按钮的标题设置方法,发现重复的代码比较多的时候,才会想起要专门抽取一个方法,让代码变得简洁。但是慢慢的,当你的经验越来越多的时候,就会形成条件反射,知道什么时候要抽取方法了。
好了这节课就到这里吧,下节课我们将会讲解如何给微博添加配图,然后我们的微博就可以完整的展示在你面前啦。