为了支持UIAccessibilityReadingContent协议,我需要我的UITextView回答关于它的行的问题。这些是我需要实现的协议方法:
- accessibilityLineNumberForPoint:给定一个坐标,返回行号。 - accessibilityContentForLineNumber:返回给定行的文本。 - accessibilityFrameForLineNumber:给定行号,返回其框架。 - accessibilityPageContent:整个文本内容。我有它。:)
我想NSLayoutManager可以帮助我,但我对它不是很有经验。我已经弄清楚了一些(我想),但仍然需要一些帮助。
苹果有一些示例代码(here)可以让我得到文本视图中的行数:
- accessibilityLineNumberForPoint:给定一个坐标,返回行号。 - accessibilityContentForLineNumber:返回给定行的文本。 - accessibilityFrameForLineNumber:给定行号,返回其框架。 - accessibilityPageContent:整个文本内容。我有它。:)
我想NSLayoutManager可以帮助我,但我对它不是很有经验。我已经弄清楚了一些(我想),但仍然需要一些帮助。
苹果有一些示例代码(here)可以让我得到文本视图中的行数:
NSLayoutManager *layoutManager = [textView layoutManager];
unsigned numberOfLines, index, numberOfGlyphs =
[layoutManager numberOfGlyphs];
NSRange lineRange;
for (numberOfLines = 0, index = 0; index < numberOfGlyphs; numberOfLines++){
(void) [layoutManager lineFragmentRectForGlyphAtIndex:index
effectiveRange:&lineRange];
index = NSMaxRange(lineRange);
}
我认为通过上面的lineRange
,我可以使用NSLayoutManager
上的这种方法来计算行矩形:
- (NSRect)boundingRectForGlyphRange:(NSRange)glyphRange inTextContainer:(NSTextContainer *)container
根据给定的lineRanges
,我应该能够通过查找包含字形索引的lineRange
来计算点的行号:
- (NSUInteger)glyphIndexForPoint:(CGPoint)point inTextContainer:(NSTextContainer *)container fractionOfDistanceThroughGlyph:(CGFloat *)partialFraction
那么现在问题是,如何在给定行号的情况下获取一行的内容(作为 NSString
)?
NSLayoutManager
提供了一些用于处理字形范围的方法,同时也提供了一些用于字符范围的方法。最后,还有两个方法可以让你在这两种范围之间进行转换:-[NSLayoutManager glyphRangeForCharacterRange:actualCharacterRange:]
和-[NSLayoutManager characterRangeForGlyphRange:actualGlyphRange:]
。要检索字符串,只需将感兴趣的glyphRange
转换为characterRange
,然后就可以使用UITextView
的textStorage
中的attributedSubstringFromRange:
或string
和substringWithRange:
检索子字符串。 - Dalzhim