知乎日报第三周总结

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

1.对于评论cell,由于每个评论内容的字数不能确定,就决定每个cell的高度不定,这里我用到Masonry约束实现UITableView自适应高度。
步骤1:
在tableView的设置中需要以下两行代码.第一行代表的是预设高度为100,第二行设置行高自动.在实现完当前步骤的时候,不要在设置任何关于行高的属性或者是代理方法.

self.tableView.estimatedRowHeight = 100;
self.tableView.rowHeight = UITableViewAutomaticDimension;

步骤2:

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

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

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

以评论和回复为例

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

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

  longLabel.font = [UIFont systemFontOfSize:15];
  NSInteger count = [self textHeightFromTextString:longstr width:widt - 90 fontSize:15].height / longLabel.font.lineHeight;
-(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重新加载。

判断回复给数组赋值

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

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;
                }

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

- (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];
    
}

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/117629.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

17. 机器学习 - 随机森林

Hi&#xff0c;你好。我是茶桁。 我们之前那一节课讲了决策树&#xff0c;说了决策树的优点&#xff0c;也说了其缺点。 决策树实现起来比较简单&#xff0c;解释解释性也比较强。但是它唯一的问题就是不能拟合比较复杂的关系。 后来人们为了解决这个问题&#xff0c;让其能…

Linux CentOS 8(HTTP的配置与管理)

Linux CentOS 8&#xff08;HTTP的配置与管理&#xff09; 目录 一、常见的 HTTP&#xff08;web&#xff09;服务软件二、基本的 Apache httpd 配置三、httpd.conf 配置文件详解案例1 四、配置虚拟主机&#xff08;在一台主机发布多个站点&#xff09;案例2 一、常见的 HTTP&a…

淘宝预定商品收不到尾款通知 - 解决方案

问题 用户在使用淘宝购买预定商品后&#xff0c;待补尾款时&#xff0c;无法收到尾款通知&#xff0c;从而导致错过补齐尾款无法购买预定商品&#xff0c;下文介绍解决方案。 解决方案 进入淘宝后&#xff0c;购买预定商品时&#xff0c;在提交订单页面时&#xff0c;取消勾…

基于单片机的智能饮水机系统

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、系统设计方案分析2.1 设计功能及性能分析2.2设计方案分析 二、系统的硬件设计3.1 系统设计框图系统软件设计4.1 总体介绍原理图 四、 结论 概要 现在很多学校以及家庭使用的饮水机的功能都是比较单一的&#…

当pytest遇上poium会擦出什么火花

首先&#xff0c;创建一个test_sample/test_demo.py 文件&#xff0c;写入下面三行代码。 def test_bing(page):page.get("https://www.bing.com")assert page.get_title "必应"不要问题 page 从哪里来&#xff0c;打开终端进入test_sample/目录&#xf…

MySQL---搜索引擎

MySQL的存储引擎是什么 MySQL当中数据用各种不同的技术存储在文件中&#xff0c;每一种技术都使用不同的存储机制&#xff0c;索引技巧 锁定水平&#xff0c;以及最终提供的不同的功能和能力&#xff0c;这些就是我们说的存储引擎。 MySQL存储引擎的功能 1.MySQL将数据存储在文…

软件测试面试最经典的5个问题

软件测试面试灵魂五问&#xff01; 请做一下自我介绍&#xff1f;你为什么从上家公司离职&#xff1f;为什么转行做测试? 你对测试行业的认识&#xff1f;你的期望薪资是多少&#xff1f;最后&#xff0c;你要问我什么&#xff1f; 一、请做一下自我介绍 简历上有的可以一两…

C++ Concurrency in Action 2nd Edition

《C Concurrency in Action - SECOND EDITION》的中文翻译-面圈网 (mianshigee.com) C/C 学习教程源码-C/C源码推荐-面试哥 (mianshigee.com) 作者正是为C11标准引入线程库的C标准委员会成员本人&#xff01;并且本书作者还编写了众多构成C标准的多线程和并发相关的提案、制定…

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題 新搭建的FLINK集群出现的问题汇总 1.新搭建的Flink集群和Hadoop集群无法正常启动Flink任务 查看这个提交任务的日志无法发现有用的错误信息。 进一步查看yarn日志&#xff1a; 发现只有JobManager的错误日志出现了如下的…

试利用栈的基本操作写出先序遍历二叉树的非递归形式的算法

试利用栈的基本操作写出先序遍历二叉树的非递归形式的算法 代码思路&#xff1a; 要用栈解决先序遍历&#xff0c;我们首先要知道栈的性质和二叉树先序遍历的规则 栈最基本的就是先进后出 而二叉树先序遍历就是“根左右” 利用这两个性质&#xff0c;我们可以先将根结点入队…

【数智化案例展】领克汽车——火山引擎助力领克汽车数字化营销实践

‍ 火山引擎案例 本项目案例由火山引擎投递并参与数据猿与上海大数据联盟联合推出的《2023中国数智化转型升级创新服务企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 领克汽车是由吉利汽车、沃尔沃汽车和吉利控股集团合资成立的全球新高端品牌。据吉…

SpringBoot + Vue2项目打包部署到服务器后,使用Nginx配置SSL证书,配置访问HTTP协议转HTTPS协议

配置nginx.conf文件&#xff0c;这个文件一般在/etc/nginx/...中&#xff0c;由于每个人的体质不一样&#xff0c;也有可能在别的路径里&#xff0c;自己找找... # 配置工作进程的最大连接数 events {worker_connections 1024; }# 配置HTTP服务 http {# 导入mime.types配置文件…

3D人像手办定制业务再掀热潮,这一次有怎样的革新?(方法篇)

最近&#xff0c;3D真人手办热潮再起&#xff0c;最出圈的一次当属亚运会的3D打印元宇宙体验舱里面各国运动员带火的真人手办定制项目。作为3D技术推广者&#xff0c;博雅仔也在后台接受了很多朋友的询问—— ◆ 技术已经成熟了吗&#xff1f; ◆ 个人定做3D真人手办市场价格…

【CSS】div 盒子居中的常用方法

<body><div class"main"><div class"box"></div></div> </body>绝对定位加 margin: auto; &#xff1a; <style>* {padding: 0;margin: 0;}.main {width: 400px;height: 400px;border: 2px solid #000;positio…

海康Visionmaster-全局触发:使用全局触发功能执行流 程的方法

我们这里以 TCP 通讯为例&#xff0c;视觉作为 TCP 服务端&#xff0c;与视觉交互的第三方设备作为 TCP 客户端。当 TCP 客户端连接上视觉服务端后&#xff0c;客户端发送字符串 T1,视觉执行流程 1&#xff1b; 客户端发送字符串 T2&#xff0c;视觉执行流程 2。 这样的需求我…

apachesolr启动带调试

这里solr.cmd报错&#xff0c;报错原因是java版本问题&#xff0c;后面发现这是因为多个java版本导致读取java_home失败&#xff0c; 那么我们修改solr.cmd中的JAVA_HOME为SOLR_JAVA_HOME IF DEFINED SOLR_JAVA_HOME set "JAVA_HOME%SOLR_JAVA_HOME%"环境变量将SOLR…

linux傻瓜式安装Java环境及中间件

linux配置Java环境及中间件 1.傻瓜式安装Java1.下载2.追加3.刷新测试 2.傻瓜式安装docker1.docker卸载2.docker安装 3.Docker傻瓜式安装Redis1.傻瓜式安装安装并配置 4.Docker傻瓜式安装RabbitMQ5.Docker傻瓜式安装MySql1.拉取2.配置 6.傻瓜式安装Nacos1.官网下载nacos2.SQL文件…

皮肤病辅助诊断软件,基于Android编写

1.系统介绍 编写的皮肤病辅助诊断软件&#xff0c;包括皮肤病识别、皮肤病区域分割、皮肤病信息介绍、识别历史记录查询、简单图像处理操作以及本机信息查询等功能 2.登录界面 运行之后首先显示登录界面 3.注册界面 注册一个账号 4.主界面 输入用户名密码点击登录按钮…

NI-9236 国产化10 kS/s/ch,350 Ω四分之一桥应变计,8通道C系列应变/桥输入模块

10 kS/s/ch&#xff0c;350 Ω四分之一桥应变计&#xff0c;8通道C系列应变/桥输入模块 NI‑9236可同步测量所有通道的动态应变&#xff0c;从而实现了高速同步测量。 该功能对于需要在特定时刻对多个通道进行比较的应用&#xff08;例如冲击测试&#xff09;非常重要。\n\nNI…

Python基础入门例程42-NP42 公式计算器(运算符)

最近的博文&#xff1a; Python基础入门例程41-NP41 二进制位运算&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程40-NP40 俱乐部的成员&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程39-NP39 字符串之间的比较&#xff08;运算符&#xff09;-C…