swift ——多行文字前面内容省略

首先来说一说ios中的 lineBreakMode
lineBreakMode : 设置文字过长时的显示截断样式

可选值如下

  • byWordWrapping : 以单词为单位换行,以单词为单位截断。
  • byCharWrapping :以字符为单位换行,以字符为单位截断。
  • byClipping : 以单词为单位换行,以字符为单位截断。
  • byTruncatingHead : 以单词为单位换行, 如果是单行,则开始部分有省略号。如果是多行,则中间有省略号。
  • byTruncatingTail : 以单词为单位换行, 无论是单行还是多行,都是末尾有省略号。
  • byTruncatingMiddle : 以单词为单位换行, 无论是单行还是多行,都是中间有省略号。

 三种省略方式如下


byTruncatingHead为头部截断,但是文字为多行时省略的是中间内容而不是头部内容,下面我们就来实现多行文字,文字超过设定行数后省略头部的功能

首先根据容器的宽度和字体的大小计将文本分割成多行

func splitTextIntoLines(text: String, width: CGFloat, font: UIFont) -> [String] {let textBox = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude) // 设定文本框的宽和最大高let attributes: [NSAttributedString.Key: Any] = [.font: font] // 定义属性字典,为了设置字体// 创建NSTextStorage,并应用上面定义的属性let textStorage = NSTextStorage(string: text, attributes: attributes)let layoutManager = NSLayoutManager() // 创建布局管理器textStorage.addLayoutManager(layoutManager) // 将布局管理器添加到文本存储中// 创建NSTextContainer,设置其大小为之前定义的textBoxlet textContainer = NSTextContainer(size: textBox)textContainer.lineFragmentPadding = 0 // 设置行片段(padding)的填充为0textContainer.maximumNumberOfLines = 0 // 表示没有最大行数限制textContainer.lineBreakMode = .byWordWrapping // 设置折行模式为按单词换行layoutManager.addTextContainer(textContainer) // 将文本容器添加到布局管理器中var lines: [String] = [] // 创建一个数组用于存储分割后的每一行文本var range = NSRange(location: 0, length: 0) // 初始化一个NSRange对象// 使用enumerateLineFragments方法获取每一行的文本layoutManager.enumerateLineFragments(forGlyphRange: NSRange(location: 0, length: layoutManager.numberOfGlyphs)) { _, usedRect, _, glyphRange, _ in// 将NSRange类型的glyphRange转换为Range<String.Index>类型,这样可以安全地使用Swift的String索引let characterRange = Range(glyphRange, in: text)if let characterRange = characterRange {let line = String(text[characterRange]) // 从原始文本中获取行文本并添加到lines数组lines.append(line)}range = NSUnionRange(range, glyphRange) // 更新处理过的字符范围}return lines // 返回包含所有行的数组}

获取想要的行数文字

/**text:字符串font:字号limit:显示行数*/func truncat(text:String,width: CGFloat, font: UIFont,limit:Int) -> String{let allLines =  splitTextIntoLines(text: text, width: width, font: font)let lines = allLines.suffix(limit)var origString = ""for (index,line) in lines.enumerated() {origString += line}print(origString)return "...\(origString)"}

效果如下

要注意的是 truncat传入的width和font要与文字容器的宽度和文字字体一致

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

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

相关文章

Chrome谷歌浏览器默认搜索引擎是bing 新建标签页自动换成必应首页

将这里的网址格式改为 https://www.bing.com/search?q%s 即可 我们可以看到这里显示灰色 所以重新添加一个即可

面向对象编程(高级)

面向对象编程&#xff08;高级&#xff09; 1、类变量和类方法 &#xff08;1&#xff09; 概念 类变量&#xff0c;也称为静态变量&#xff0c;是指在类级别声明的变量。它们与特定类相关联&#xff0c;而不是与类的实例&#xff08;对象&#xff09;相关联。每个类变量只有…

QML —— SwipeView、PageIndicator组合示例(附完整源码)

示例效果 介绍 SwipeView提供了一个基于滑动的导航模型,由一组页面组成。一次只能看到一个页面。用户可以通过横向滑动在页面之间导航。请注意,SwipeView本身是完全不可见的。建议将其与PageIndicator结合使用,以向用户提供有多个页面的视觉线索。 PageIndicator用于指示包含…

猫咪主食冻干K9、希喂、SC生骨肉冻干哪款好?详细对比测评这三款产品

随着科学养猫的观念深入人心&#xff0c;越来越多的铲屎官开始关注猫咪主食的营养与健康。主食冻干&#xff0c;作为一种模拟猫咪原始猎食的食品&#xff0c;因其高营养保留而受到广大猫奴的喜爱。相比传统的膨化猫粮&#xff0c;主食冻干更符合猫咪的饮食天性&#xff0c;提供…

css 编写圆角矩形只有左侧一半的样式

实现该样式&#xff1a;尺寸大小可自由调整修改 <div class"abc"></div>.abc{width: 50px;height: 300px;border: 1px solid red;border-right: none;border-top-left-radius: 10px;border-bottom-left-radius: 10px;}

WSL 与真实 linux 环境区别有多大?

随着 Windows 系统的不断发展和完善&#xff0c;WSL&#xff08;Windows Subsystem for Linux&#xff09;作为 Windows 10 的一个功能&#xff0c;为 Windows 用户提供了一个可以在 Windows 环境下运行 Linux 二进制可执行文件的环境。然而&#xff0c;尽管 WSL 为用户提供了一…

美格智能5G RedCap模组SRM813Q通过广东联通5G创新实验室测试认证

近日&#xff0c;美格智能5G RedCap轻量化模组SRM813Q正式通过广东联通5G创新实验室端到端的测试验收&#xff0c;获颁测评证书。美格智能已连续通过业内两家权威实验室的测试认证&#xff0c;充分验证SRM813Q系列模组已经具备了成熟的商用能力&#xff0c;将为智慧工业、安防监…

【数据不完整?用EM算法填补缺失】期望值最大化 EM 算法:睹始知终

期望值最大化算法 EM&#xff1a;睹始知终 算法思想算法推导算法流程E步骤&#xff1a;期望M步骤&#xff1a;最大化陷入局部最优的原因 算法应用高斯混合模型&#xff08;Gaussian Mixture Model, GMM&#xff09;问题描述输入输出Python代码实现 算法思想 期望值最大化方法&a…

虚幻UE 增强输入-第三人称模板增强输入分析与扩展

本篇是增强输入模块&#xff0c;作为UE5.0新增加的模块。 其展现出来的功能异常地强大&#xff01; 让我们先来学习学习一下第三人称模板里面的增强输入吧&#xff01; 文章目录 前言一、增强输入四大概念二、使用步骤1、打开增强输入模块2、添加IA输入动作2、添加IMC输入映射内…

JAVA学习专栏

JAVA专栏 Java核心技术 Java核心技术 Java练手算法 Java练手算法 Java数据结构和算法 Java数据结构和算法 Java设计模式 Java设计模式 Java并发编程 Java并发编程 MySQL数据库 MySQL数据库 Java项目管理Maven Java项目管理Maven 项目管理工具gradle 项目管理工具gradle…

Open3D聚类算法

按照官网的例子使用聚类&#xff0c;发现结果是全黑的。 经过多次测试发现 eps3.3, min_points1这里是关键 min_points必须等于1否则无效果 import time import open3d as o3d; import numpy as np; import matplotlib.pyplot as plt#坐标 mesh_coord_frame o3d.geometry.Tria…

Git如何将多个commit合并一个commit

问题场景&#xff1a;我在fork的仓库提交多个commit后&#xff0c;准备向原仓库提交pr&#xff0c;但是原仓库要求一个pr一个commit&#xff0c;因此需要先将这些commit合并为一个。 1.先拿到要合并的commit中最早的一个的commit id&#xff0c;然后进入仓库&#xff0c;使用如…