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

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

相关文章:

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 .cyanvie…...

java使用 TCP 的 Socket API 实现客户端服务器通信

一:什么是 Socket(套接字) Socket 套接字是由系统提供于网络通信的技术, 是基于 TCP/IP 协议的网络通信的基本操作,要进行网络通信, 需要有一个 socket 对象, 一个 socket 对象对应着一个 socket 文件, 这个文件在 网卡上而不是硬盘上, 所以有了 sokcet…...

conda从4.12升级到最新版23.9 自动升级失败 手动升级方法

最新版conda有多线程下载,还做了一些其它易用性改动,所以决定从很老的4.12版本升级到最新版。因为版本差别过大,使用自带的conda update conda已经不起作用了。 手动升级最先想到的是把老环境全部导出为yaml文件,在新环境里全部重…...

WPF下实现拖动任意地方都可以拖动窗口

首先在xaml中添加事件 <Window PreviewMouseLeftButtonDown"Window_PreviewMouseLeftButtonDown"PreviewMouseMove"Window_PreviewMouseMove"PreviewMouseLeftButtonUp"Window_PreviewMouseLeftButtonUp"/>然后脚本输入 Point _pressedP…...

Swin Transformer

Swin Transformer 简介 下采样的层级设计&#xff0c;能够逐渐增大感受野。采用window进行注意力计算&#xff0c;极大降低了内存消耗&#xff0c;避免了整张图像尺寸大小的qkv矩阵滑窗操作包括不重叠的 local window&#xff0c;和重叠的 cross-window。不重叠的local window…...

【csapp lab】lab2_bomblab

文章目录 前言实验内容phase_1phase_2phase_3phase_4phase_5phase_6secret_phase 前言 刚做了csapp lab2&#xff0c;记录一下。 我这里用的的系统环境是Ubuntu22.04&#xff0c;是64位系统&#xff0c;与用32位系统可能有所差异。 实验共包括七个阶段&#xff0c;每个阶段考…...

开发者分享 | Ascend C算子开发及单算子调用

本文分享自《AscendC算子开发及单算子调用》&#xff0c;作者&#xff1a;goldpancake。 笔者在阅读Ascend C官方文档的过程中发现&#xff0c;对于初学者来说&#xff0c;尤其是第一次接触异构编程思想的初学者&#xff0c;有部分内容是无需特别关注的&#xff0c;例如算子工…...

如何在 Linux 上部署 RabbitMQ

如何在 Linux 上部署 RabbitMQ 文章目录 如何在 Linux 上部署 RabbitMQ安装 Erlang从预构建的二进制包安装从源代码编译 Erlang RabbitMQ 的安装使用 RabbitMQ Assistant 连接 RabbitMQ Assistant 是一款优秀的RabbitMQ 可视化管理工具&#xff0c;提供丰富的管理功能。下载地址…...

解决更换NodeJs版本后npm -v返回空白

一、问题描述 win11电脑上输入cmd进入控制台&#xff0c;输入 node --version 有正常返回安装的nodejs的版本号 再输入 npm -v 返回空白。正常情况应该是要返回版本号。 二、问题背景 最近准备学习vue&#xff0c;在不久前已经安装了NodeJs和python。运行了好几个开源项…...

【ES常用查询】基于ElasticsearchRestTemplate及NativeSearchQuery的查询

包含当前es所有的查询&#xff0c; 需要什么代码直接照搬&#xff0c;改个参数就行&#xff01; 用的好请务必给我点赞&#xff01;&#xff01;&#xff01;感谢爱你们&#xff01;&#xff01;&#xff01; &#xff08;周末更 筒&#xff09; 为啥写这篇文章呢&#xff…...

全志XR806基于http的无线ota功能实验

XR806不仅硬件功能多&#xff0c;XR806也提供了功能极其丰富的SDK&#xff0c;几天体验下来非常容易上手。常见的功能几乎都有相应的cmd或demo实现&#xff0c;HAL也做得非常全面&#xff0c;非常适合快速开发。这一点超级好评&#xff01;本文章要实现的无线OTA也基于该SDK。 …...

2023年11月15号期中测验选择题(Java)

本篇续接《2023年11月15号期中测验判断题&#xff08;Java&#xff09;》->传送门 2-1 以下程序运行结果是 public class Test extends Father{private String name"test";public static void main(String[] args){Test test new Test();System.out.println(tes…...

C# static关键字详解

在C#中&#xff0c;static关键字有许多重要的用途。以下是关于如何使用static关键字的一些详细信息&#xff1a; 静态类&#xff08;Static Classes&#xff09;&#xff1a;静态类是不能实例化的类&#xff0c;它的所有成员都是静态的。静态类常常用作工具类或帮助类&#xff…...

开发一款回合制游戏,需要注意什么?

随着游戏行业的蓬勃发展&#xff0c;回合制游戏因其深度的策略性和令人着迷的游戏机制而受到玩家们的热烈欢迎。如果你计划投身回合制游戏的开发领域&#xff0c;本文将为你提供一份详细的指南&#xff0c;从游戏设计到发布&#xff0c;助你成功打造一款引人入胜的游戏。 1. 游…...

java的包装类

目录 1. 包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱 1.3 自动装箱和自动拆箱 1. 包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了 一个包装类型。 若想了解…...

【数据结构(一)】线性结构和非线性结构

文章目录 线性结构和非线性结构1. 线性结构2. 非线性结构 线性结构和非线性结构 数据结构包括&#xff1a;线性结构和非线性结构。 1. 线性结构 线性结构作为最常用的数据结构&#xff0c;其特点是数据元素之间存在一对一的线性关系。线性结构有两种不同的存储结构&#xff…...

持续集成指南:GitHubAction 自动构建+部署AspNetCore项目

前言 之前研究了使用 GitHub Action 自动构建和发布 nuget 包&#xff1a;开发现代化的.NetCore控制台程序&#xff1a;(4)使用GithubAction自动构建以及发布nuget包 现在更进一步&#xff0c;使用 GitHub Action 在其提供的 runner 里构建 docker 镜像&#xff0c;之后提交到阿…...

Docker 笔记(三)--容器

Docker 笔记&#xff08;三&#xff09;–容器 记录Docker 安装操作记录&#xff0c;便于查询。 参考 链接: Docker 入门到实战教程(三)镜像和容器链接: docker run中的-itd参数正确使用链接: docker官方文档链接: 阿里云Debian 镜像链接: Debian 全球镜像站链接: Debian/Ub…...

gd32关于IO引脚配置的一些问题

一、gd32f103的PA15问题 1、 #define GPIO_SWJ_NONJTRST_REMAP ((uint32_t)0x00300100U) /*!< full SWJ(JTAG-DP SW-DP),but without NJTRST */ #define GPIO_SWJ_SWDPENABLE_REMAP ((uint32_t)0x00300200U) /*!< JTAG-DP disabled and SW-DP enab…...

QT小记:警告Use multi-arg instead

"Use multi-arg instead" 是一个提示&#xff0c;建议使用 QObject::tr() 函数的多参数版本来处理多个占位符&#xff0c;而不是使用单参数版本。 在 Qt 中&#xff0c;tr() 是用于进行文本翻译&#xff08;国际化&#xff09;的函数。它允许你在应用程序中使用多种…...

服务器日志分析实战:用Python追踪HTTP 404错误并可视化异常频率

作为一名爬虫开发者或网站运维人员,服务器日志就像飞机的“黑匣子”——它记录了每个请求的来龙去脉。而404错误(页面未找到)尤其值得关注:它可能是用户输错了网址,可能是你爬虫的URL构造逻辑有漏洞,也可能是网站改版后旧的链接失效了。更严重的是,大量突然涌出的404请求…...

SkillVLA:通过技能复用应对双-臂操纵中的组合多样性

26年3月来自新加坡国立、北京中关村学院、上海创新研究院、上海AI实验室、上海交大和复旦的论文“SkillVLA: Tackling Combinatorial Diversity in Dual-Arm Manipulation via Skill Reuse”。 视觉-语言-动作&#xff08;VLA&#xff09;模型近期取得的进展&#xff0c;已充分…...

VMware ESXi 9.1.0.0集成NVME+网卡驱动版发布|新特性+驱动集成+部署升级+FAQ全指南

一、ESXi 9.1.0.0 正式版核心新特性 VMware ESXi 9.1.0.0&#xff08;2026 年 5 月发布&#xff09;是 vSphere 9.1 核心组件&#xff0c;聚焦硬件兼容扩展、性能跃升、安全加固、运维简化四大方向&#xff0c;重点强化 NVMe 存储与网卡生态适配&#xff0c;以下为关键更新&am…...

1901-2022年中国气温变化分析实战:用这份1km栅格数据我们能发现什么?

1901-2022年中国气温变化分析实战&#xff1a;如何从1km栅格数据中挖掘气候演变规律当一份覆盖122年、分辨率精确到1公里的气温栅格数据摆在面前时&#xff0c;我们看到的不仅是数字矩阵&#xff0c;更是一部写在经纬度坐标里的气候变迁史诗。这份由逐月数据聚合生成的逐年气温…...

从RD、CS到WK:一文讲透SAR主流成像算法的演进与选型实战

从RD、CS到WK&#xff1a;SAR成像算法选型实战指南 当无人机掠过灾区上空&#xff0c;或卫星扫描地球表面时&#xff0c;合成孔径雷达&#xff08;SAR&#xff09;正通过电磁波穿透云层和黑暗&#xff0c;将地面信息转化为高分辨率图像。而决定图像质量的关键&#xff0c;在于工…...

CPU架构启发的智能仓储布局优化实践

1. 仓库布局优化的核心挑战与创新机遇在物流仓储领域&#xff0c;拣货环节通常占据运营成本的55%-65%&#xff0c;而其中约50%的时间消耗在无效行走路径上。传统矩形仓库布局虽然易于规划和施工&#xff0c;但其正交的通道设计导致拣货员需要频繁进行90度转向&#xff0c;这种&…...

告别DLL缺失烦恼!Visual C++运行库合集一键搞定Windows应用依赖问题

告别DLL缺失烦恼&#xff01;Visual C运行库合集一键搞定Windows应用依赖问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经在打开某个软件或游戏时…...

Unity项目DrawCall降不下来?试试用Mesh Baker合并贴图集,保姆级图文教程

Unity性能优化实战&#xff1a;用Mesh Baker合并贴图集降低DrawCall全流程解析当你的Unity项目帧率开始卡顿&#xff0c;Profiler里DrawCall数字居高不下时&#xff0c;合并贴图集往往是解决问题的关键一步。本文将以一个实际项目为例&#xff0c;带你从零开始使用Mesh Baker的…...

量子纠错码VarQEC:原理、实现与硬件优化

1. 量子纠错码基础与实验背景量子纠错码&#xff08;Quantum Error Correction Codes, QEC&#xff09;是量子计算中保护量子信息免受噪声影响的核心技术。与经典纠错码不同&#xff0c;量子纠错需要应对量子态特有的退相干和纠缠特性。传统QEC如[[5,1,3]]完美码虽然理论完备&a…...

如何用HsMod解锁炉石传说60+项隐藏功能:终极优化指南

如何用HsMod解锁炉石传说60项隐藏功能&#xff1a;终极优化指南 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是一款基于BepInEx开发的炉石传说功能增强插件&#xff0c;为玩家提供…...