知乎日报第三周总结

news2024/12/23 11:43:32

这周主要完成了评论的加载和长评论的展开与收起,同时完善了前面的内容,文章内容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];
    
}

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL(9):子查询

子查询 指一个查询语句嵌套在另一个查询语句内部的查询&#xff0c;这个特性从MySQL 4.1开始引入。 SQL 中子查询的使用大大增强了 SELECT 查询的能力&#xff0c;因为很多时候查询需要从结果集中获取数据&#xff0c;或者需要从同一个表中先计算得出一个数据结果&#xff0c;…

python学习10

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

Mybatis技术原理详解之:使用Mapper形式和注解驱动的复杂映射开发

Mybatis技术原理详解之&#xff1a;使用Mapper形式和注解驱动的复杂映射开发 Mapper形式的复杂映射开发 一对一查询 一对一查询的模型 ⽤户表和订单表的关系为&#xff0c;⼀个⽤户有多个订单&#xff0c;⼀个订单只从属于⼀个⽤户 ⼀对⼀查询的需求&#xff1a;查询⼀个订…

AFL入门教学

1、AFL简介 AFL&#xff08;American Fuzzy Lop&#xff09;是一个面向安全的模糊测试工具&#xff0c;它使用了一个新的编译时插桩技术和遗传算法&#xff0c;可以自动发现触发目标二进程程序的测试用例&#xff0c;从而大大提高测试代码的功能覆盖率。 AFL官网&#xff1a;…

090基于web+springboot的中小企业设备管理系统

欢迎大家关注&#xff0c;一起好好学习&#xff0c;天天向上 文章目录 一项目简介技术介绍 二、功能组成三、效果图四、 文章目录 一项目简介 本中小企业设备管理系统管理员有个人中心&#xff0c;用户管理&#xff0c;员工管理&#xff0c;设备信息管理&#xff0c;配件信息管…

计算机报错找不到msvcp110.dll无法继续执行代码怎么解决?

msvcp110.dll文件丢失是一个相当常见的问题&#xff0c;尤其是在运行某些程序或游戏时。这个问题可能会导致程序无法正常运行&#xff0c;甚至可能导致系统崩溃。那么&#xff0c;面对这样的问题&#xff0c;我们应该如何来解决呢&#xff1f;下面&#xff0c;我将分享我解决问…

LabVIEW开发实时离子温度测量

LabVIEW开发实时离子温度测量 迈向核聚变发电的漫长旅程&#xff0c;旨在提供无限的清洁能源。离子温度是产生聚变点火条件中最重要的参数之一&#xff0c;快速简单地测量离子温度的技术至关重要。特别是对于未来的聚变反应堆来说&#xff0c;需要一种使用等离子体发出的物理现…

Python基础入门例程43-NP43 判断布尔值(条件语句)

最近的博文&#xff1a; Python基础入门例程42-NP42 公式计算器&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程41-NP41 二进制位运算&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程40-NP40 俱乐部的成员&#xff08;运算符&#xff09;-CSDN博客…

【Servlet】Servlet的生命周期

目录 一、Servlet的生命周期 二、Servlet的生命周期演示图 三、线程安全问题 四、解决线程安全问题 面试题 一、Servlet的生命周期 1.类加载和实例化 Servlet容器(如Tomcat)负责加载和实例化Servlet。当容器是首次启动或首次请求某个Servlet时&#xff0c;容器就会读取w…

英语小作文模板(10招募+通知;15通知+介绍)

10招募&#xff0b;通知&#xff1a; 题目背景及要求 第一段 第二段 第三段 翻译 15通知&#xff0b;介绍 &#xff1a; 题目背景及要求 第一段 第二段 第三段 15通知&#xff0b;介绍&#xff08;2&#xff09; 第一段 第二段 第三段 重金求子通知

Python---练习:使用循环嵌套打印正等腰三角形

案例&#xff1a; 使用循环嵌套打印正等腰三角形 如图&#xff1a; 思考&#xff1a; 首先&#xff0c;给了样式&#xff0c;有几行&#xff0c;也就是明确的次数&#xff0c;所以用while循环&#xff0c;for循环是针对没有明确次数用的。 while循环基本语法&#xff1a; 结…

Python基础入门例程45-NP45 禁止重复注册(条件语句)

最近的博文&#xff1a; Python基础入门例程44-NP44 判断列表是否为空&#xff08;条件语句&#xff09;-CSDN博客 Python基础入门例程43-NP43 判断布尔值&#xff08;条件语句&#xff09;-CSDN博客 Python基础入门例程42-NP42 公式计算器&#xff08;运算符&#xff09;-C…

【电路笔记】-谐波

谐波 文章目录 谐波1、概述2、频谱分析3、已知信号4、未知信号5、总结 周期性信号并不总是完美的正弦模式&#xff0c;例如我们之前有关 正弦波的文章之一中介绍的那样。 有时&#xff0c;信号确实可以是简单正弦波的叠加&#xff0c;它们被称为复杂波形。 在本文中&#xff0…

第一章 introduction to software testing

文章目录 基本概念validation / verificationinput domain / output domaindeterministic / non-deterministicterminate / not-terminate Testing概念testing 的目的Fault, failure, error测试三要素 (3 essential pieces of information)测试输入预期输出执行测试 test execu…

AI写作神器,轻松搞定职场公文写作!

在当今数字化时代&#xff0c;人工智能技术的快速发展为各行各业带来了许多便利&#xff0c;因为AI写作的普及&#xff0c;使许多职场人士能够更加快速地撰写出高质量的公文&#xff0c;作为一家引领智能AI写作潮流的在线平台&#xff0c;boardmix博思白板以其独特的优势在这个…

D-Link账号密码泄露

构造payload&#xff1a; /getcfg.php SERVICESDEVICE.ACCOUNT&attackture%0D%0AAUTHORIZED_GROUP%3D1漏洞证明&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感谢。 免责声明&#xff1a;由于传播或利用此文所提供的信息、技…

CCF-CSP真题《202305-4 电力网络》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202305-4试题名称&#xff1a;电力网络时间限制&#xff1a;1.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 问题描述 西西艾弗岛电力公司需要修建一套电网对岛上的众…

贝叶斯网络:利用变量消除(Variable Elimination)进行推理

贝叶斯网络简介 贝叶斯网络(Bayesian network)也叫贝氏网路、信念网络&#xff08;belief network&#xff09;或是有向无环图&#xff08;DAG&#xff09;模型&#xff0c;是一种概率图模型。它利用DAG的结构&#xff0c;得到一组随机变量{X1,X2,...,Xn}的条件概率分布&#…

Java中的static

目录 static修饰成员变量 静态成员变量特征 static修饰成员方法 【静态方法特性】 static成员变量初始化 就地初始化 静态代码块初始化 注意事项 static修饰成员变量 静态成员变量特征 static修饰的成员变量&#xff0c;称为静态成员变量&#xff0c;静态成员变量最大的…

matplotlib从起点出发(10)_Tutorial_10_Layout

使用受约束的绘图干净整洁地将图形合适排列。 受约束的布局会自动调整子图&#xff0c;以便刻度标签、图例和颜色条等装饰不会重叠&#xff0c;同时仍保留用户请求的逻辑布局。 受约束布局类似于“紧密布局”&#xff0c;但它要更灵活。它处理放置在多个轴上的Axes(放置颜色条…