Iphone 对于CTLine来说,有“CTLine”意味着什么;字符串访问“;?

Iphone 对于CTLine来说,有“CTLine”意味着什么;字符串访问“;?,iphone,ios,uilabel,core-text,ctlineref,Iphone,Ios,Uilabel,Core Text,Ctlineref,我试图解决一个问题,我已经解决了大部分问题,除了一件事:我很难理解CTLine拥有“字符串访问”意味着什么 我想使用的方法是CTLineGetOffsetForStringIndex 以下是我不理解的文档部分(重点是我的): charIndex沿基线的主偏移,或0.0(如果 行不支持字符串访问。 当我运行这个方法时,我得到了0.0,所以我猜这意味着该行不支持字符串访问-但这到底是什么意思?语句“该行不支持字符串访问”可以推断为意味着文本行可以而不是被视为可以通过每个字符的索引访问的字符序列 这可

我试图解决一个问题,我已经解决了大部分问题,除了一件事:我很难理解
CTLine
拥有“字符串访问”意味着什么

我想使用的方法是
CTLineGetOffsetForStringIndex

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

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

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

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

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

  • 所讨论的文本行中存在超过零个字符(在同一行中转换为字形或空格的字符)
  • 文本行中没有占用任何“空格”的字符
  • 现在,我们来为这个推论提供一些基本原理

    苹果的文档提供了文本工具包的描述,UILabel就是基于此构建的:

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

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

    图8-1文本套件框架位置

    文本工具包使您能够完全控制用户界面元素中的文本呈现。除了UITextView之外,UITextField和UILabel构建在文本工具包之上,并与动画、UICollectionView和UITableView无缝集成。文本工具包采用完全可扩展的面向对象体系结构进行设计,该体系结构支持子类化、委托和一组完整的通知,支持深度定制

    对的回答提到了几个类,如
    NSTextStorage
    NSLayoutManager
    ,以及
    NSTextContainer

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

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

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

    func boundingRect(forGlyphRange glyphRange: NSRange, in container: NSTextContainer) -> CGRect
    
    返回单个边界矩形(在容器坐标中),该矩形包含在给定文本容器中为给定glyph范围绘制的所有glyph和其他标记,包括在其线段矩形外绘制的glyph和下划线等文本属性


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

    无需代码-我正在尝试理解苹果的文档所说的内容,而不是在这里寻求关于我自己代码的帮助。谢谢@布莱恩克拉克:这方面有什么进展吗?@BarrettJ没有,什么都没有:(我刚刚就这件事开了一个悬赏,因为我也碰到了一堵墙。在我的例子中,这是我100%的错误,我迭代了几行,然后遍历了每行的范围。在最内部的循环中,我做了一些事情,效果是
    CTLineGetOffsetForStringIndex(line,lineIndex,NULL)
    。我使用的是行的索引(在我的例子中总是0-因为我的测试文本没有换行),我应该使用
    lin