26

我正在尝试用 UILabel解决一个棘手的问题,并且我已经弄清楚了大部分问题,除了一件事:我在理解CTLine拥有“字符串访问”意味着什么时遇到了挑战。

我想使用的方法是CTLineGetOffsetForStringIndex. 这是该方法文档的链接。

这是我不理解的文档部分(重点是我的):

charIndex 沿基线的主要偏移量,如果行不支持字符串访问,则为 0.0。

当我运行这个方法时,我0.0回来了,所以我猜这意味着该行不支持字符串访问——但这究竟意味着什么?

4

1 回答 1

1

声明“该行不支持字符串访问”可以推断为意味着文本行可能被视为可以通过每个字符的索引访问的字符序列。

这可能会引发关于视觉字符与非视觉字符以及字形与字符的大型讨论。但为了简化讨论,假设一行文本可能具有以下状态之一:

  1. 多于零个字符(在同一行内转换为字形或空白的字符)存在于相关文本行中
  2. 文本行中没有字符占用任何“空格”

现在为这个推论提供一些理由。

Apple 的文档提供了对 Text Kit 的描述,UILabel 正是基于该描述构建的:

UIKit 框架包括几个用于在应用程序的用户界面中显示文本的类:UITextView、UITextField 和 UILabel,如在 iOS 中显示文本内容中所述。从 UITextView 类创建的文本视图旨在显示大量文本。底层 UITextView 是一个强大的布局引擎,称为 Text Kit。如果您需要自定义布局过程或需要干预该行为,则可以使用 Text Kit。对于需要自定义解决方案的少量文本和特殊需求,您可以使用替代的、较低级别的技术,如较低级别文本处理技术中所述。

Text Kit 是 UIKit 框架中的一组类和协议,提供高质量的排版服务,使应用程序能够存储、布局和显示具有精细排版的所有特征的文本,例如字距调整、连字、换行和对齐. Text Kit 构建在 Core Text 之上,因此它提供了相同的速度和功能。UITextView 与 Text Kit 完全集成;它提供了编辑和显示功能,使用户能够输入文本、指定格式属性并查看结果。其他 Text Kit 类提供文本存储和布局功能。图 8-1 显示了 Text Kit 在其他 iOS 文本和图形框架中的位置。

图 8-1 文本工具包框架位置 图 8-1 文本工具包框架位置

Text Kit 让您可以完全控制用户界面元素中的文本呈现。除了 UITextView,UITextField 和 UILabel 都是建立在 Text Kit 之上的,它与动画、UICollectionView 和 UITableView 无缝集成。Text Kit 采用完全可扩展的面向对象体系结构设计,支持子类化、委托和一套全面的通知​​,可实现深度定制。

相关问题的答案提到了几个类,例如NSTextStorageNSLayoutManagerNSTextContainer

考虑UILabel使用上述所有类来提供在 parent 中显示文本的最终结果,UIView最终用户在屏幕上看到。布局管理器(的实例NSLayoutManager)协调文本视图、文本容器和文本存储之间的数据流,从而在视图中显示字符。布局管理器将字符映射到字形,并确定使用哪些行来布局字形。布局管理器还计算出如何显示不属于字形的下划线和删除线等内容。

对这个讨论很重要的是布局管理器对文本行进行布局。如果该文本行是可选择的,则用户可以选择该行中的可见字符。在这种特殊情况下,该行存在“字符串访问”。

类似的概念是相关问题的解决方案中发布的方法:

func boundingRect(forGlyphRange glyphRange: NSRange, in container: NSTextContainer) -> CGRect

返回单个边界矩形(在容器坐标中),包含在给定文本容器中为给定字形范围绘制的所有字形和其他标记,包括在其线片段矩形和文本属性(例如下划线)之外绘制的字形。

最后,该函数的参考讨论CTLineGetOffsetForStringIndex谈到了适用于绘制自定义插入符号的图形偏移。插入符号可用于显示插入点或文本选择。主要和次要偏移量可以被认为是字符串的开始和结束索引——一个字符序列。如果给定行没有字符序列,则不能有选定字符、插入符号、字形范围。因此没有“字符串访问”。

于 2018-03-18T13:53:26.167 回答