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.mzph.cn/news/151738.shtml

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

相关文章

线上发生锁表怎么办 show processlist命令详解

大厂面试题:千万级别mysql表锁表了怎么办,如何处理 - 知乎 (zhihu.com) 记一次mysql执行DDL导致锁表_ddl 为啥会锁表-CSDN博客 mysql: show processlist 详解 - 知乎 (zhihu.com)

Redis字典实现

前言 字典又称符号表,关联数组或者映射(map)。是一种保存键值对的抽象数据结构。在字典中一个键和一个值进行关联。这些关联的值被称为键值对。 字典中每一个键都是独一无二的,没有重复的。我们可以通过键来查找值,更新值或者删除整个键值对等…

如何定位el-tree中的树节点当父元素滚动时如何定位子元素

使用到的方法 Element 接口的 scrollIntoView() 方法会滚动元素的父容器,使被调用 scrollIntoView() 的元素对用户可见。 参数 alignToTop可选 一个布尔值: 如果为 true,元素的顶端将和其所在滚动区的可视区域的顶端对齐。相应的 scrollIntoV…

算法学习 day26

第二十六天 最大子数组和 53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 动态规划问题 class Solution {public int maxSubArray(int[] nums) {int len nums.length;int[] dp new int[len];dp[0] nums[0];int res dp[0];for(int i 1; i < len; i){dp[i] …

Docker 可视化面板 ——Portainer

Portainer 是一个非常好用的 Docker 可视化面板&#xff0c;可以让你轻松地管理你的 Docker 容器。 官网&#xff1a;Portainer: Container Management Software for Kubernetes and Docker 【Docker系列】超级好用的Docker可视化工具——Portainer_哔哩哔哩_bilibili 环境 …

OpenCV C++ 图像 批处理 (批量调整尺寸、批量重命名)

文章目录 图像 批处理(调整尺寸、重命名)图像 批处理(调整尺寸、重命名) 拿着棋盘格,对着相机变换不同的方角度,采集十张以上(以10~20张为宜);或者棋盘格放到桌上,拿着相机从不同角度一通拍摄。 以棋盘格,第一个内焦点为坐标原点,便于计算世界坐标系下三维坐标; …

远程文件包含演示

远程文件包含 基本介绍 受害机器 10.9.47.181 攻击者机器1 10.9.47.41 攻击者机器2 10.9.47.217 实现过程 受害者机器开启phpstudy 并且开启允许远程连接 攻击者机器1上有一个文件&#xff0c;内容是phpinfo(); 攻击者机器1提供web服务使得受害者机器能够访问到攻击者…

庖丁解牛:NIO核心概念与机制详解 02 _ 缓冲区的细节实现

文章目录 PreOverview状态变量概述PositionLimitCapacity演示&#xff1a; 观察变量 访问方法get() 方法put()方法类型化的 get() 和 put() 方法 缓冲区的使用&#xff1a;一个内部循环 Pre 庖丁解牛&#xff1a;NIO核心概念与机制详解 01 接下来我们来看下缓冲区内部细节 Ov…

如何学习算法

在不知其所以然的情况下&#xff0c;算法只是一堆离散的机械步骤&#xff0c;缺少背后的思想的支撑&#xff0c; 这些步骤之间就没有一个本质层面上的关联&#xff08;先知亚里士多德早就指出&#xff1a;学习即联接&#xff09;。 所以就跟背历史书也没多大区别。然而&#xf…

IPO解读丨高处不胜寒,澜沧古茶低头取暖?

自A股注册制改革不断深化并全面落地后&#xff0c;不少意欲登陆资本市场的企业转战港股。这个过程中&#xff0c;诞生了很多以“港股”为前缀的“第一股”——“白酒第一股”珍酒李渡、“水果零售第一股”百果园、“智能驾驶第一股”知行汽车、“运动科技第一股”Keep…… 由A…

实现CAS自旋锁

CAS 在高并发场景&#xff0c;可以使用加锁、CAS来保证原子性&#xff0c;但是加锁是很重量级的操作&#xff0c;CAS类似于乐观锁CAS &#xff08; Compare and swap &#xff09;比较并交换&#xff0c;是实现并发算法时常用到的技术&#xff0c;包含三个操作数&#xff1a;内…

力扣刷题-二叉树-完全二叉树的节点个数

222.完全二叉树的节点个数 给出一个完全二叉树&#xff0c;求出该树的节点个数。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5,6] 输出&#xff1a;6 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;0 示例 3&#xff1a; 输入&#xff1a;root [1]…

springMvc中的拦截器【巩固】

先实现下想要的拦截器功能 package com.hmdp.utils;import com.hmdp.entity.User; import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Ht…

Pandas get_dummies用法

get_dummies 是 pandas 实现one hot encode的方式 ​  one-hot的基本思想&#xff1a;将离散型特征的每一种特征取值都看成一种状态&#xff0c;若指定离散特征中有N个 不相同的取值&#xff0c;那么我们就可以将该特征抽象成N种不同的状态&#xff0c;one-hot编码保证了每一…

10 Redis的持久化

Redis支持RDB和AOF两种持久化机制 1、RDB(Redis DataBase) 是对命令的全量快照随着key的数量增大&#xff0c;那么写入磁盘的开销也会越来越大 2、RDB文件的生成是否会阻塞主线程 save: 使用save的方式会阻塞主线程&#xff0c;影响redis的性能 bgsave: 一般情况下不会阻塞…

05-networkX-结构洞计算

教程仓库地址&#xff1a;github networkx_tutorial import networkx as nx import matplotlib.pyplot as pltimport pandas as pd import networkx as nxdf pd.read_csv(./df.csv,index_col0) df.head()AB0H04N5H04N71G06F3G02F12G06F3H03K173G02F1H03K174NaNNaN # 检查 A 和…

C语言模拟实现Liunx操作系统与用户之间的桥梁shell(代码详解)

什么是shell&#xff1f; Shell&#xff08;壳&#xff09;是指命令行界面&#xff08;CLI&#xff09;或脚本语言&#xff0c;它为用户提供了与操作系统交互的方式。它是一个程序&#xff0c;从用户那里接收命令&#xff0c;并通过与操作系统内核交互来执行这些命令。Shell充当…

CDN加速在社会发展中的挑战与机遇

随着互联网的迅猛发展&#xff0c;CDN&#xff08;内容分发网络&#xff09;加速技术在网络领域的应用逐渐成为推动社会进步的关键因素之一。CDN加速通过在全球范围内分布的服务器群&#xff0c;将内容快速分发到用户&#xff0c;提升了网络性能和用户体验。然而&#xff0c;CD…

CTFHub Git泄露

Log 前言 根据题目描述&#xff0c;这个题目需要使用到工具 GitHack 来完成&#xff0c;而 CTFHub 上提供的工具需要在 python2 环境中执行&#xff0c;注意 python3 环境无法使用。 GitHack准备&#xff08;kali Linux&#xff09; 打开虚拟机 sudo su 以管理员的身份运行…

开源更安全? yum源配置/rpm 什么是SSH?

文章目录 1.开放源码有利于系统安全2.yum源配置&#xff0c;这一篇就够了&#xff01;(包括本地&#xff0c;网络&#xff0c;本地共享yum源)3.rpm包是什么4.SSH是什么意思&#xff1f;有什么功能&#xff1f; 1.开放源码有利于系统安全 开放源码有利于系统安全 2.yum源配置…