知乎日报仿写--第四周

知乎日报仿写--第四周

  • 前言
    • 评论区数据的请求
    • cell高度的计算
    • cell高度对其子视图的自适应
    • Uilabel的自适应高度
    • cell上的视图最好不要直接移除

前言

这两周完成的东西比较少,有金工实习的原因也有自身的一些原因,但尽量下周完成知乎日报的仿写 ;
这两周完成了评论区数据的请求,cell高度的计算,cell高度自适应,以及对以前bug的修复 ;

评论区数据的请求

这一步本质上只是一步简单的网络请求获取数据,但在使用这些数据时常常会使程序因为数组越界和访问不存在的索引奔溃,因为所以最好在前一个界面就进行网络请求,然后传值传入下一个界面 ;

 //提前加载好评论区的数据
    NSString* longurlstring = [NSString stringWithFormat:@"https://news-at.zhihu.com/api/4/story/%@/long-comments",self.mModel.mmModel.newsarray[self.mModel.index][@"id"]] ;
    NSURL* longurl = [NSURL URLWithString:longurlstring] ;
    [[Manager shareSingleton] NetWorkGetDatelongcomments:^(long_commentsModel * _Nullable model) {
        self.mModel.long_commentsdict = [model toDictionary] ;
    } andError:^(NSError * _Nullable error) {
        NSLog(@"%@",error) ;
    } andURL:longurl] ;
    //请求短评论数据
    NSString* shorturlstring = [NSString stringWithFormat:@"https://news-at.zhihu.com/api/4/story/%@/short-comments",self.mModel.mmModel.newsarray[self.mModel.index][@"id"]] ;
    NSURL* shorturl = [NSURL URLWithString:shorturlstring] ;
    [[Manager shareSingleton] NetWorkGetDatelongcomments:^(long_commentsModel * _Nullable model) {
        self.mModel.short_commentsdict = [model toDictionary] ;
    } andError:^(NSError * _Nullable error) {
        NSLog(@"%@",error) ;
    } andURL:shorturl] ;


- (void)presspinglun {  //评论按钮
    pinglunViewController* vc = [[pinglunViewController alloc] init] ;
    vc.extradict = self.mModel.extrdict ;
    vc.id = self.mModel.mmModel.newsarray[self.mModel.index][@"id"] ;
    vc.long_commentsdict = self.mModel.long_commentsdict ;
    vc.short_commentsdict = self.mModel.short_commentsdict  ;
    [self.navigationController pushViewController:vc animated:YES] ;
    
}

cell高度的计算

在、评论区的cell高度需要适应其上面子视图的高度,所以我们要提前计算好cell需要的高度保存下来,这里有两种方法,一种是创建一个对应text的Uilabel对象,获取其高度,但这种方法很明显会浪费大量内存,所以正确的方法应该是直接计算对应文本所会占据的高度 ;

NSString* text01 = self.mModel.long_commentsdict[@"comments"][i][@"content"] ;
        if (self.mModel.long_commentsdict[@"comments"][i][@"reply_to"] != nil) {
            NSLog(@"%@",self.mModel.long_commentsdict[@"comments"][i][@"reply_to"]) ;
            text01 = [NSString stringWithFormat:@"%@\n//%@: %@",self.mModel.long_commentsdict[@"comments"][i][@"content"],self.mModel.long_commentsdict[@"comments"][i][@"reply_to"][@"author"],self.mModel.long_commentsdict[@"comments"][i][@"reply_to"][@"content"]] ;
        }
        UIFont *font01 = [UIFont systemFontOfSize:17] ;
        CGSize constraintSzie01 = CGSizeMake(100, CGFLOAT_MAX) ;
        NSDictionary* attributes01 = @{NSFontAttributeName: font01} ;
        CGRect textRect01 = [text01 boundingRectWithSize:constraintSzie01 options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes01 context:nil] ;
        CGFloat labelHeight01 = ceil(CGRectGetHeight(textRect01)) ;
        NSLog(@"%f",labelHeight01) ;
        NSLog(@"%@",text01) ;

cell高度对其子视图的自适应

嗯,其实也不能这么说,我的想法是利用Masonry的约束功能,来自动布局cell上的视图,从而达到自适应的一个效果,不过这个方法依赖于cell的高度一定要提前计算并保存下来 ;据网上搜索的值,其实还可以利用tableviewcell自身的方法和属性来实现自适应布局;

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    pinglunTableViewCell* cell = [self.mView.tableview dequeueReusableCellWithIdentifier:@"0"] ;
    if (cell == nil) {
        cell = [[pinglunTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"0"] ;
    }
    [cell.wenzhanglabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(cell.contentView).offset(60);
        make.left.mas_equalTo(90) ;
        make.width.mas_equalTo(170) ;
    }] ;
    [cell.timelabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.bottom.equalTo(cell.contentView).offset(20) ;
        make.left.mas_equalTo(90) ;
        make.width.mas_equalTo(170) ;
        make.height.mas_equalTo(30) ;
    }] ;
    [cell.zanbtn mas_makeConstraints:^(MASConstraintMaker *make) {
        make.bottom.equalTo(cell.contentView).offset(20) ;
        make.left.mas_equalTo(270) ;
        make.width.mas_equalTo(30) ;
        make.height.mas_equalTo(30) ;
    }] ;
    [cell.pingbtn mas_makeConstraints:^(MASConstraintMaker *make) {
        make.bottom.equalTo(cell.contentView).offset(20) ;
        make.left.mas_equalTo(320) ;
        make.width.mas_equalTo(30) ;
        make.height.mas_equalTo(30) ;
    }] ;
    [cell.extrabtn mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(cell.contentView).offset(30) ;
        make.left.mas_equalTo(320) ;
        make.width.mas_equalTo(30) ;
        make.height.mas_equalTo(30) ;
    }] ;
    [cell.tapbtn mas_makeConstraints:^(MASConstraintMaker *make) {
        make.bottom.equalTo(cell.contentView).offset(20) ;
        make.left.mas_equalTo(150) ;
        make.width.mas_equalTo(70) ;
        make.height.mas_equalTo(30) ;
    }] ;
    [cell.replylabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.bottom.equalTo(cell.contentView).offset(-60) ;
        make.left.mas_equalTo(90) ;
        make.width.mas_equalTo(170) ;
        make.height.mas_equalTo(40) ;
    }] ;
    
    if (indexPath.section == 1) {
        [cell.tapbtn removeFromSuperview] ;
    }
    
    
    return cell;
}

Uilabel的自适应高度

通过Masonry,可以非常简单的实现,只要不对高度进行约束就可以了,但这种自适应高度是无法获取高度的,所以cell得高度我还是觉得算一下比较好 ;

[cell.wenzhanglabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(cell.contentView).offset(60);
        make.left.mas_equalTo(90) ;
        make.width.mas_equalTo(170) ;
    }] ;

cell上的视图最好不要直接移除

cell上的视图直接移除在cell复用时可能会使程序奔溃,这里建议通过视图的hidden属性对视图进行隐藏 ;

先写这么多了,这周赶进度 ;

你可能感兴趣的:(开发语言)