码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【iOS】UITableView的动态Cell高度(Masonry)


    动态cell高度

    • 评论长度不同引出的问题
    • 实现


    评论长度不同引出的问题

    对于之前写的项目的评论部分,由于评论文字字数的不同会导致label高度不同,所以需要设定不同的cell高度来展示。

    一开始使用了

    CGSize labelSize = [label.text boundingRectWithSize:CGSizeMake(Width - 40 - 50 , MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:17]} context:nil].size;
    
    • 1

    这个方法得到的labelSize.height就是计算得到的高度。这样以来将每个评论都计算一次,用数组存储,待到需要时遍历数组取出就好了。

    这样并不是很方便,尤其是有的评论有回复,有的没有回复,这样就需要计算回复的label高度再做判断,更加麻烦。

    所以这时候就体现了Masonry的方便

    实现

    对于tableViewCell的动态高度,首先设定好tableView的属性:

    	self.tableView.estimatedRowHeight = 200;
        self.tableView.rowHeight = UITableViewAutomaticDimension;
    
    • 1
    • 2

    estimateRowHeight是预估高度,是还没有加载好评论时的cell高度,当评论的高度已经确定,cell会刷新高度。

    UITableViewAutomaticDimension就是把cell的行高设为自动(变化的)尺寸

    对自定义cell,要将masonry设定的约束写到

    - (instancetype) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

    写到这个方法内部

    如下:

     	self.content = [[UILabel alloc] init];
        [self.contentView addSubview: self.content];
        [self.content mas_makeConstraints:^(MASConstraintMaker *make) {
            //由于要自适应的cell,所以不用宽高约束
            make.left.equalTo(self.author).with.offset(0);
            make.top.equalTo(self.contentView).with.offset(50);
            make.right.equalTo(self.contentView).with.offset(-40);
            make.bottom.equalTo(self.labelReply.mas_top).offset(0);
        }];
    
    	self.labelReply = [[UILabel alloc] init];
        [self.contentView addSubview:self.labelReply];
    	[self.labelReply mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.equalTo(self.content.mas_left).with.offset(0);
            make.right.equalTo(self.content.mas_right).with.offset(0);
    
            make.top.equalTo(self.content.mas_bottom).with.offset(0);
    
            make.bottom.equalTo(self.time.mas_top).offset(-15);
        }];
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    这样就是把content和labelReply设置为左右对齐,上下紧贴的两个label,并且会自动生成高度,无需任何计算。

    另外对于tableView,下面这个设定行高的方法就不需要了,也不建议去写,很有可能出错。

    - (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    
    • 1

    请添加图片描述

  • 相关阅读:
    三十二、W5100S/W5500+RP2040树莓派Pico<UPnP示例>
    shell 监听指定日志变化进行相关业务处理
    matlab神经网络求解最优化,matlab神经网络应用设计
    【板栗糖GIS】DOS—如何在目录文件中批量建立子文件夹
    企业有必要上人事档案信息管理系统吗
    洛谷P4213 杜教筛模板
    EI论文联合复现:含分布式发电的微网/综合能源系统储能容量多时间尺度线性配置方法程序代码!
    ThreadPoolTaskScheduler的使用以及动态修改cron表达式时的任务stop与start
    Linux解压tar.gz文件
    《Go语言在微服务中的崛起:为什么Go是下一个后端之星?》
  • 原文地址:https://blog.csdn.net/zdsey/article/details/128068350
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号