【问题标题】:What does it mean for a CTLine to have "string access"?CTLine 具有“字符串访问权限”是什么意思?
【发布时间】:2013-10-26 19:25:02
【问题描述】:

我正在尝试解决hairy problem with UILabel,我已经弄清楚了大部分问题,除了一件事:我很难理解CTLine 拥有“字符串访问权限”意味着什么”。

我想使用的方法是CTLineGetOffsetForStringIndexHere's a link to the documentation for the method.

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

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

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

【问题讨论】:

  • 不需要代码 - 我试图理解 Apple 的文档在说什么,而不是在这里就我自己的代码寻求帮助。谢谢!
  • @bryanjclark 这方面有什么进展吗?
  • @BarrettJ 不,没什么' :(
  • 我刚刚为此开了一个赏金,因为我也为此撞到了墙上。在我的情况下,这是我 100% 的错误,我在遍历行,然后遍历每行的范围。在最里面的循环中,我正在做一些达到CTLineGetOffsetForStringIndex(line, lineIndex, NULL) 的效果。我正在使用该行的索引(在我的情况下始终为 0 - 因为我的测试文本没有换行),而我应该使用 lineRangeIndex 代替。
  • CTLineGetOffsetForStringIndex 的一个糟糕之处在于它为错误状态返回了一个潜在的有效值。返回值 0.0 可能仅表示该行以请求的索引开头。你确定不是这样吗?

标签: iphone ios uilabel core-text ctlineref


【解决方案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 Text Kit 框架位置

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

related question 的答案提到了几个类,例如 NSTextStorageNSLayoutManagerNSTextContainer

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-08-21
    • 1970-01-01
    • 2015-09-07
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    相关资源
    最近更新 更多