知乎日报第三周总结

这周主要完成了评论的加载和长评论的展开与收起,同时完善了前面的内容,文章内容cell的滑动刷新改为滑动一个加载一个,这样就更加流畅;还有就是首次点击只先加载当前cell内容,这样就不会卡顿加载过多内容,剩下的同样滑动一次加载一次。

1.对于评论cell,由于每个评论内容的字数不能确定,就决定每个cell的高度不定,这里我用到Masonry约束实现UITableView自适应高度。

步骤1:

在tableView的设置中需要以下两行代码.第一行代表的是预设高度为100,第二行设置行高自动.在实现完当前步骤的时候,不要在设置任何关于行高的属性或者是代理方法.

objectivec 复制代码
self.tableView.estimatedRowHeight = 100;
self.tableView.rowHeight = UITableViewAutomaticDimension;

步骤2:

当前步骤很重要,对cell的布局有要求,注意两点

1,布局在纵向上要能撑起整个cell,比如一个label,label距cell的contentView上边缘的距离和下边缘的距离都要设置,同时label要是自适应高度.

2,一般自定义cell的时候,子控件都是贴到cell的contentView上面的,同时布局的父控件也要是contentView,不然会出现约束冲突.

以评论和回复为例

objectivec 复制代码
       [self.userComment mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(self.contentView).mas_offset(48);
            make.left.mas_equalTo(self.userIcon.mas_right).mas_offset(10);
            make.right.mas_equalTo(-20);
            make.height.mas_lessThanOrEqualTo(heigh);
            
        }];
        
        [self.replyComment mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(self.userComment.mas_bottom).mas_offset(10);
            make.left.mas_equalTo(self.userIcon.mas_right).mas_offset(10);
            make.right.mas_equalTo(-20);
            make.height.mas_lessThanOrEqualTo(heigh);
            make.bottom.equalTo(self.contentView).mas_offset(-60);
        }];

usercomments的头部以contentsView的头部为约束,replycomment

的底部以contentsView的头部为约束,同时replycomment的头部又会以usercomments的底部为约束,这样就把这个cell撑开了。

那contentLabel的高度怎么出来?可以看到我根本是没有具体设置contentLabel的height,原因就是contentLabel的text就决定了contentLabel的高度,内容的多少会自动将contentLabel的高度撑开。

2,对于评论的回复的展开和收起,我们需要先判断是否用回复,同时还要判断回复的行数是否超过两行,如果超过两行,就要添加回复的展开与收起按钮,否者就将按钮隐藏。

对于如何计算评论的行数的代码

objectivec 复制代码
  longLabel.font = [UIFont systemFontOfSize:15];
  NSInteger count = [self textHeightFromTextString:longstr width:widt - 90 fontSize:15].height / longLabel.font.lineHeight;
objectivec 复制代码
-(CGSize)textHeightFromTextString:(NSString *)text width:(CGFloat)textWidth fontSize:(CGFloat)size{
    // 计算 label 需要的宽度和高度
    NSDictionary *dict = @{NSFontAttributeName:[UIFont systemFontOfSize:size]};
    CGRect rect = [text boundingRectWithSize:CGSizeMake(textWidth, MAXFLOAT) options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil];
    
     CGSize size1 = [text sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:size]}];
    
    return CGSizeMake(size1.width, rect.size.height);
}

最开始时我直接就在cell加载函数判断了回复的的行数并进行了相应的加载,导致在按钮的点击事件无法改变回复的展开与收回。这里需要先讲将每个评论cell的加载状态存放在数组里,没次cell的加载都通过每个评论cell的对应的数组内容进行判断,在按钮的点击事件里改变数组的内容,然后将tableView重新加载。

判断回复给数组赋值

objectivec 复制代码
for (int i = 0; i < self.shortReviewsModel.comments.count; i++) {
        [self.selectedArray addObject:@"0"];
    }
    for (int i = 0; i < self.shortReviewsModel.comments.count; i++) {
        if ([self.shortReviewsModel.comments[i] valueForKey:@"reply_to"]) {
            NSString* shortstr = [NSString stringWithFormat:@"//%@:  %@",[[self.shortReviewsModel.comments[i] valueForKey:@"reply_to"] valueForKey:@"author"] , [[self.shortReviewsModel.comments[i] valueForKey:@"reply_to"] valueForKey:@"content"]];
            UILabel* shortLabel = [[UILabel alloc] init];
            shortLabel.font = [UIFont systemFontOfSize:15];
            NSInteger count = [self textHeightFromTextString:shortstr width:widt - 90 fontSize:15].height / shortLabel.font.lineHeight;
            if (count <= 2) {
                [self.selectedArray replaceObjectAtIndex:i withObject:@"1"];
            } else {
                [self.selectedArray replaceObjectAtIndex:i withObject:@"2"];
            }
        }
    }

根据数组的内容加载cell

objectivec 复制代码
if ([self.selectedArray[indexPath.row] isEqualToString:@"1"]) {
                    cell.changeButton.hidden = YES;
                    cell.replyComment.numberOfLines = 0;
                }
                if ([self.selectedArray[indexPath.row] isEqualToString:@"2"]) {
                    cell.changeButton.hidden = NO;
                    [cell.changeButton setTitle:@".  展开全文" forState:UIControlStateNormal];
                    cell.replyComment.numberOfLines  = 2;
                }
                if ([self.selectedArray[indexPath.row] isEqualToString:@"3"]) {
                    cell.changeButton.hidden = NO;
                    [cell.changeButton setTitle:@".  收起" forState:UIControlStateNormal];
                    cell.replyComment.numberOfLines  = 0;
                }

点击按钮,改变数组的内容

objectivec 复制代码
- (void)pressChangeButton:(UIButton*) btn {
    if (btn.tag > 10000) {
        if ([self.longSelectedArray[btn.tag - 10000] isEqualToString:@"2"]) {
            [self.longSelectedArray replaceObjectAtIndex:(int)btn.tag withObject:@"3"];
        } else {
            [self.longSelectedArray replaceObjectAtIndex:(int)btn.tag withObject:@"2"];
        }
    } else {
        if ([self.selectedArray[btn.tag] isEqualToString:@"2"]) {
            [self.selectedArray replaceObjectAtIndex:(int)btn.tag withObject:@"3"];
        } else {
            [self.selectedArray replaceObjectAtIndex:(int)btn.tag withObject:@"2"];
        }
    }
    [self.reviewsTableView reloadData];
    
}
相关推荐
2501_915909062 小时前
iOS 应用反调试技详解术 检测调试器的原理与防护实践
android·ios·小程序·https·uni-app·iphone·webview
游戏开发爱好者83 小时前
TraceEagle 代理抓包详解,无感代理、去证书绑定与 HTTP/3 解密能力解析
网络协议·计算机网络·网络安全·ios·adb·https·udp
aiopencode4 小时前
SwiftUI Introspect生产环境完全指南:为什么它是安全可靠的选择
后端·ios
for_ever_love__5 小时前
iOS: 网络管理单例
学习·ios·objective-c
00后程序员张5 小时前
iOS加固技术路线全面解析:Bitcode模式、源码模式与汇编模式对比及爱加密优势
android·汇编·ios·小程序·uni-app·cocoa·iphone
ii_best15 小时前
更新!移动端开发软件按键安卓版&手机助手v5.1.0上线!本地AI识别全面解锁,脚本开发再升级
android·人工智能·ios·按键精灵
weixin_4038101318 小时前
03-iOS免越狱无线投屏-上传图片和视频到相册
ios·新媒体运营·跨境电商·ios自动化·ios投屏·ios智能体·ios脚本
2501_9160074719 小时前
SwiftUI 声明式语法与 Xcode 预览功能详解
ide·vscode·ios·swiftui·个人开发·xcode·敏捷流程
2501_916008891 天前
iOS IPA文件反编译与打包操作方法,拆包分析防护和加固打包
android·macos·ios·小程序·uni-app·cocoa·iphone
码云数智-大飞1 天前
iOS 卡顿排查指南:主线程阻塞与 UI 渲染优化实战
ui·ios