iOS_折叠展开 FoldTextView

1. 显示效果

Test1:直接使用:

在这里插入图片描述


Test2:在 cell 里使用:

在这里插入图片描述

2. 使用

2.1 直接使用

// 1.1 init view
private lazy var mooFoldTextView: MOOFoldTextView = {let view = MOOFoldTextView(frame: .zero)view.backgroundColor = .cyanview.mooDelegate = selfreturn view
}()
// 1.2 init conifg
private lazy var attributeTextConfig: MOOFoldTextConfig = {let config = MOOFoldTextConfig()config.allText ="""Swift is a type-safe language, which means the language helps you to be clear about\the types of values your code can work with. If part of your code requires a String,\type safety prevents you from passing it an Int by mistake. Likewise, type safety\prevents you from accidentally passing an optional String"""config.paragraph.lineSpacing = 10.0config.contentWidth = CGRectGetWidth(self.view.bounds)return config
}()// 2.1 add to super view
self.view.addSubview(self.mooFoldTextView)
// 2.2 set config and reload
self.mooFoldTextView.mooConfig = self.mooFoldTextConfig
self.mooFoldTextView.mooReloadText()// 3 set frame
self.mooFoldTextView.frame = CGRect(x: 0.0,y: 100.0,width: CGRectGetWidth(self.view.bounds),height: self.mooFoldTextConfig.mooCurrentHeight())// 4 Implement Proxy
extension MOOTest1ViewController: MOOFoldTextViewDelegate {func mooFoldViewShouldUpdateLayout(_ foldTextView: MOOFoldTextView) {// update layout after fold state changedself.view.setNeedsLayout()}
}         

2.2 在 cell 中使用

2.2.1 at Custom TableViewCell
// 1.1 init
private lazy var attributeTextView: MOOFoldTextView = {let view = MOOFoldTextView(frame: .zero)view.backgroundColor = .cyanview.mooDelegate = selfreturn view
}()
// 1.2 add to super view
self.contentView.addSubview(self.attributeTextView)
// 1.3 set frame
self.attributeTextView.frame = self.contentView.bounds// 2 receive config and set to textView
var mooConfig: MOOFoldTextConfig = MOOFoldTextConfig() {didSet {self.attributeTextView.mooConfig = self.mooConfigself.attributeTextView.mooReloadText()}
}// 3.1 define protocol to forward event
public protocol MOOTableViewCellDelegate: AnyObject {func mooCellShouldReloadData(_ cell: UITableViewCell)
}
// 3.2
weak var mooDelegate: MOOTableViewCellDelegate?
// 3.3
extension MOOTableViewCell: MOOFoldTextViewDelegate {func mooFoldViewShouldUpdateLayout(_ foldTextView: MOOFoldTextView) {self.mooDelegate?.mooCellShouldReloadData(self)}
}
2.2.2 at View Controller
import MOOFoldTextView// 4.1 init tableView
private lazy var tableView: UITableView = {let view = UITableView(frame: .zero, style: .grouped)view.register(MOOTableViewCell.self, forCellReuseIdentifier: "MOOTableViewCell")view.dataSource = selfview.delegate = selfreturn view
}()
// 4.2 init dataSource with config
private lazy var dataSource: [MOOFoldTextConfig] = {let config = MOOFoldTextConfig()config.allText ="""Swift is a type-safe language, which means the language helps you to be clear about\the types of values your code can work with. If part of your code requires a String,\type safety prevents you from passing it an Int by mistake. Likewise, type safety\prevents you from accidentally passing an optional String"""config.paragraph.lineSpacing = 10.0config.contentWidth = CGRectGetWidth(self.view.bounds)return [config]
}()
// 4.3 add to super view
self.view.addSubview(self.tableView)
self.tableView.reloadData()
// 4.4 set frame
self.tableView.frame = CGRect(x: 0.0,y: 100.0,width: CGRectGetWidth(self.view.bounds),height: CGRectGetHeight(self.view.bounds) - 100.0);// 5.1 Implementation UITableViewDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {return self.dataSource.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {let cell = tableView.dequeueReusableCell(withIdentifier: "MOOTableViewCell",for: indexPath)if let cell = cell as? MOOTableViewCell {cell.mooConfig = self.dataSource[indexPath.row]cell.mooDelegate = self}return cell
}
// 5.2 Implementation UITableViewDelegate
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {let config = self.dataSource[indexPath.row]return config.currentHeight()
}// 6 reload data after fold state changed
extension MOOTest2ViewController: MOOTableViewCellDelegate {func mooCellShouldReloadData(_ cell: UITableViewCell) {self.tableView.reloadData()}
}

github

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模块化Common JS 和 ES Module

目录 历程 1.几个函数:全局变量的污染,模块间没有联系 2.对象:暴露成员,外部可修改 3.立即执行函数:闭包实现模块私有作用域 common JS module和Module 过程 模块依赖:深度优先遍历、父 -> 子 -…

Python基础:错误和异常

在Python中的错误可(至少)被分为两种:语法错误和 异常,均是指在程序中发生的问题和意外情况。Python提供了异常处理机制,使程序能够更容易地应对这些问题。 1. 语法错误(Syntax Error) 语法错误…

YOLOv8优化策略:轻量级Backbone改进 | VanillaNet极简神经网络模型 | 华为诺亚2023

🚀🚀🚀本文改进:一种极简的神经网络模型 VanillaNet,支持vanillanet_5, vanillanet_6, vanillanet_7, vanillanet_8, vanillanet_9, vanillanet_10, vanillanet_11等版本 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,…

ubuntu20.04在docker下运行ros-noetic进行开发

经常折腾虚拟机各双系统 , 想着不如把docker利用起来,下面算是一个初学者使用docker运行ros的记录: 1. 安装 使用官方安装脚本自动安装 curl -fsSL https://test.docker.com -o test-docker.shsudo sh test-docker.sh验证是否安装成功 doc…

命令执行相关函数及各类命令执行绕过技巧

相关函数 (命令注入) 命令执行的绕过

【LeetCode刷题日志】232.用栈实现队列

🎈个人主页:库库的里昂 🎐C/C领域新星创作者 🎉欢迎 👍点赞✍评论⭐收藏✨收录专栏:LeetCode 刷题日志🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,…

公网访问全能知识库工具AFFINE,Notion的免费开源替代

文章目录 公网访问全能知识库工具AFFINE,Notion的免费开源替代品前言1. 使用Docker安装AFFINE2. 安装cpolar内网穿透工具3. 配置AFFINE公网访问地址4. 实现公网远程访问AFFINE 公网访问全能知识库工具AFFINE,Notion的免费开源替代品 前言 AFFiNE 是一个…

穷举法、回溯法、分支界限法解决旅行商(TSP)问题

文章目录 一、问题描述二、穷举法解决2.1 介绍2.2 代码 三、回溯法解决四、分支界限法4.1 介绍4.2 代码 一、问题描述 有一个旅行商由某城市出发,经过所有给定的 n n n 个城市后,再回到出发的城市。除了出发的城市外,其它城市只经过一回。这…

RepVgg: 网络结构重参化

CVPR2021 截至目前1004引 论文连接 代码连接 文章提出的问题 大多数的研究者追求的是设计一个好的网络结构,这种“好”体现在网络具有复杂的网络设计,这种网络虽然比简单的网络收获了更加高的准确率,但是网络结构中的大量并行分支,导致模型的难以应用和自定义,主要体现…

【神印王座】月夜大尺度诱惑,皓晨潜入月魔宫,枫秀降临男扮女装

Hello,小伙伴们,我是拾荒君。 为了能安全回到联盟,龙皓晨决定让月夜商队护送他们,这也是他们目前处境更快更安全回到人类境地的方法。于是,龙皓晨只身一人去寻找月夜,此次执行的任务完全超出龙皓晨的掌握之外&#xf…

Docker中快速安装RabbitMQ

文章目录 前言一、安装Docker二、安装RabbitMQ无脑命令行运行 总结 前言 在Ubuntu中的Docker容器中快速安装RabbitMQ,亲测有效,不废话,上操作。 一、安装Docker 直接按照Docker官方教程操作:官方安装教程 点进官网,往…