献给初学iOS的小盆友们——微博app项目开发之十四转发微博修正以及添加微博工具条

上节课我们完成了原创微博的界面调整,这节课我们要完成转发微博的一些调整,以及搭建完整的微博工具条。用到的思想和方法也和前面没有什么大的不同,原理上是一样的。

本节内容

  • 修改转发微博昵称显示
  • 搭建微博工具条

本节资料代码

第十四节代码资料

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。在实际开发中,你可能不会立马想到抽取代码,而是先写好某一个按钮的标题设置方法,发现重复的代码比较多的时候,才会想起要专门抽取一个方法,让代码变得简洁。但是慢慢的,当你的经验越来越多的时候,就会形成条件反射,知道什么时候要抽取方法了。
好了这节课就到这里吧,下节课我们将会讲解如何给微博添加配图,然后我们的微博就可以完整的展示在你面前啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值