当前位置: 首页 > news >正文

Swift-UITableView列表动态设置高度,根据不同的内容长度,设置heightForRowAt

此篇文章主要阐述如何利用swift语言,实现返回内容不同长度文本的高度,比如第一个列表文字1行,只需要50像素高度,第二个列表文字超出了1行,如2行,那么就自动调整这个单元文本的高度;

用MVC实现(view,cell,model,controller)

最终效果图如下:

在这里插入图片描述

一:Controller层

import UIKitclass TestController: BaseViewController {let TESTCELLCODECONTROLLER = "TESTCELLCODECONTROLLER"private var testView = TestView()private var dataList = [TestModel]()override func viewWillAppear(_ animated: Bool) {super.viewWillAppear(animated)aboutNavigationCenter(title: "测试")}override func initView() {super.initView()testView.frame = self.view.boundstestView.tableView?.delegate = selftestView.tableView?.dataSource = selfself.view.addSubview(testView)}override func initData() {super.initData()dataList = TestModel.getTestModel()testView.tableView?.reloadData()}
}extension TestController: UITableViewDelegate {func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {let model = dataList[indexPath.row]let cell = TestCell(style: .default, reuseIdentifier: TESTCELLCODECONTROLLER)cell.configure(with: model)let width = tableView.frame.width - 20 // Adjust based on cell paddinglet textHeight = cell.textLine.sizeThatFits(CGSize(width: width, height: CGFloat.greatestFiniteMagnitude)).heightreturn textHeight + 90 // Add padding}func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {return dataList.count}func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {// Handle cell selection}
}extension TestController: UITableViewDataSource {func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {var cell = tableView.dequeueReusableCell(withIdentifier: TESTCELLCODECONTROLLER) as? TestCellif cell == nil {cell = TestCell(style: .default, reuseIdentifier: TESTCELLCODECONTROLLER)}let model = dataList[indexPath.row]cell?.configure(with: model)return cell!}
}

二:View层

import UIKitclass TestView: BaseView {var tableView:UITableView?override func initView() {//主viewtableView = UITableView()tableView!.separatorStyle = .noneself.addSubview(tableView!)tableView!.snp.makeConstraints{(make)->Void inmake.top.equalTo(self).offset(20)make.left.equalTo(self).offset(0)make.right.equalTo(self).offset(0)make.bottom.equalTo(self).offset(0)}}
}

三:Cell层

import UIKit
import SnapKitclass TestCell: BaseCell {var mConView: UIView?var textLine: UILabel!var additionalTextLine: UILabel! // 新的 UILabelvar additionalTextLine2: UILabel! // 新的 UILabeloverride init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {super.init(style: style, reuseIdentifier: reuseIdentifier)mConView = UIView()mConView!.layer.borderWidth = 1.0mConView!.layer.borderColor = UIColor.black.cgColormConView!.layer.cornerRadius = 10.0self.contentView.addSubview(mConView!)mConView!.snp.makeConstraints { make inmake.left.equalTo(self.contentView).offset(10)make.right.equalTo(self.contentView).offset(-10)make.top.equalTo(self.contentView).offset(10)make.bottom.equalTo(self.contentView).offset(-10)}textLine = UILabel()textLine.numberOfLines = 0textLine.lineBreakMode = .byWordWrappingtextLine.backgroundColor = UIColor.redmConView!.addSubview(textLine)textLine.snp.makeConstraints { make inmake.left.equalTo(mConView!).offset(10)make.top.equalTo(mConView!).offset(10)make.right.equalTo(mConView!).offset(-10)}additionalTextLine = UILabel()additionalTextLine.numberOfLines = 0additionalTextLine.lineBreakMode = .byWordWrappingadditionalTextLine.backgroundColor = UIColor.blue // 设置不同颜色mConView!.addSubview(additionalTextLine)additionalTextLine.snp.makeConstraints { make inmake.left.equalTo(mConView!).offset(10)make.top.equalTo(textLine.snp.bottom).offset(5) // 新文本在旧文本下方make.right.equalTo(mConView!).offset(-10)}additionalTextLine2 = UILabel()additionalTextLine2.backgroundColor = UIColor.yellow // 设置不同颜色additionalTextLine2.numberOfLines = 0additionalTextLine2.lineBreakMode = .byWordWrappingmConView!.addSubview(additionalTextLine2)additionalTextLine2.snp.makeConstraints { make inmake.left.equalTo(mConView!).offset(10)make.top.equalTo(additionalTextLine.snp.bottom).offset(5) // 新文本在旧文本下方make.right.equalTo(mConView!).offset(-10)}}required init?(coder: NSCoder) {fatalError("init(coder:) has not been implemented")}func configure(with model: TestModel) {textLine.text = model.lineTextModeladditionalTextLine.text = model.additionalTextModel // 假设你在模型中有这个属性additionalTextLine2.text = model.additionalTextModel2textLine.sizeToFit()additionalTextLine.sizeToFit()additionalTextLine2.sizeToFit()}
}

四:Model层

import UIKitclass TestModel:NSObject{var lineTextModel:String?var additionalTextModel:String?var additionalTextModel2:String?class func getTestModel() -> [TestModel]{var array = [TestModel]()let model = TestModel()model.lineTextModel = "SAKDHJSAKICJFDBSJDHSCV"model.additionalTextModel = "我是测试1"model.additionalTextModel2 = "我是测试1"array.append(model)let model2 = TestModel()model2.lineTextModel = "vklmnxvlkfxklfjdjhjdsfjlvkkljvkfdjfdkjvfdkfjlklcodejdsfjlvkkljvkfdjfdkjvfdkfjlklcode"model2.additionalTextModel = "我是测试2"model2.additionalTextModel2 = "我是测试1"array.append(model2)let model3 = TestModel()model3.lineTextModel = "vfdkfjlklcodejdsfjlvkkljvkfdjfdkjvfdkfjlklcodevklmnxvlkfxklfjdjhjdsfjlvkkljvkfdjfdkjvfdkfjlklcodejdsfjlvkkljvkfdjfdkjvfdkfjlklcode"model3.additionalTextModel = "我是测试3"model3.additionalTextModel2 = "我是测试1"array.append(model3)return array}
}

复制粘贴,运行,看效果,完美!功能测试无问题,谢谢各位的阅读与关注;继续加油!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • WHAT - 通过 react-use 源码学习 React
  • 电商数据分析的价值
  • 订单类业务创建自增编码
  • Tongweb8074+7049m4 安装TongFlowControl(by lqw)
  • 指针(三)
  • MySQL 数据库自动分区
  • 使用Python恢复Windows、Linux、MacOS回收站中的文件和目录
  • MinIO实战攻略:轻松构建私有云存储解决方案
  • streamlit+wordcloud使用pyinstaller打包遇到的一些坑
  • boost库容器之Circular Buffer功能介绍,及使用示例
  • 神经网络微调技术全解(04)-- Prompt Tuning-可训练提示(Learnable Prompts)
  • 第十章 rust网络编程基础
  • 基于web的停车场管理系统设计与实现-计算机毕设 附源码 16856
  • Kafka·概述
  • 【计算机网络】计算机网络的分层结构
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 「译」Node.js Streams 基础
  • 【391天】每日项目总结系列128(2018.03.03)
  • Git初体验
  • input实现文字超出省略号功能
  • JSONP原理
  • Linux gpio口使用方法
  • MaxCompute访问TableStore(OTS) 数据
  • mongodb--安装和初步使用教程
  • nginx 负载服务器优化
  • React-flux杂记
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Terraform入门 - 3. 变更基础设施
  • vue-router 实现分析
  • 安卓应用性能调试和优化经验分享
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 免费小说阅读小程序
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 移动端唤起键盘时取消position:fixed定位
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 关于Android全面屏虚拟导航栏的适配总结
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​如何使用QGIS制作三维建筑
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $.ajax中的eval及dataType
  • (C++17) optional的使用
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (ZT)出版业改革:该死的死,该生的生
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (三)终结任务
  • (实战篇)如何缓存数据
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)WLAN定义和基本架构转
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)