我正在尝试解决一个hairy problem with UILabel,我已经弄清楚了大部分问题,除了一件事:我很难理解对CTLine
来说意味着什么有“字符串访问权”。
我想使用的方法是CTLineGetOffsetForStringIndex
。 Here's a link to the documentation for the method.
以下是我不理解的文档部分(重点是我的):
charIndex沿着基线的主偏移,或0.0如果是 line不支持字符串访问。
当我运行此方法时,我得到了0.0
,所以我猜这意味着该行不支持字符串访问 - 但这究竟是什么意思?
答案 0 :(得分:1)
语句“该行不支持字符串访问”可以推断为意味着文本行可以不被视为可以由每个字符的索引访问的字符序列
这可能会引发关于视觉角色与非视觉角色,以及字形与角色的大讨论。但为了简化讨论,假设一行文本可能具有以下状态之一:
现在为这种推断提供一些理由。
Apple的文档提供了构建UILabel的Text Kit的描述:
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文本和图形框架中的位置。
Text Kit使您可以完全控制用户界面元素中的文本呈现。除了UITextView之外,UITextField和UILabel都构建在Text Kit之上,并且它与动画,UICollectionView和UITableView无缝集成。 Text Kit采用完全可扩展的面向对象架构设计,支持子类化,委派和一组完整的通知,支持深度自定义。
related question的答案提及了几个类,例如NSTextStorage
,NSLayoutManager
和NSTextContainer
。
考虑UILabel
使用以上所有类来提供在最终用户在屏幕上看到的父UIView
中显示文本的最终结果。布局管理器(NSLayoutManager
的实例)协调文本视图,文本容器和文本存储之间的数据流,从而在视图中显示字符。布局管理器将字符映射到字形,并确定用于布置字形的行。布局管理器还会计算出如何显示下划线和删除线等内容,这些内容不是字形的一部分。
本讨论的重点是布局管理器列出文本的行。如果该行文本是可选择的,则用户可以选择该行中的可见字符。在这种特殊情况下,线路有“字符串访问”。
类似的概念是相关问题的解决方案中公布的方法:
func boundingRect(forGlyphRange glyphRange: NSRange, in container: NSTextContainer) -> CGRect
返回单个边界矩形(在容器坐标中),其中包含给定文本容器中为给定字形范围绘制的所有字形和其他标记,包括在其线段矩形外部绘制的字形和文本属性(如下划线)。
最后,函数CTLineGetOffsetForStringIndex
的参考讨论说明了适合绘制自定义插入符的图形偏移。插入符号可用于显示插入点或文本选择。主要和次要偏移可以被认为是字符串的开始和结束索引 - 字符序列。如果给定行没有字符序列,则可能没有选定的字符,没有插入符号,没有字形范围。因此没有“字符串访问”。