爲了支持UIAccessibilityReadingContent
協議,我需要我的UITextView來回答有關其線路的問題。這些協議的,我需要實現的方法:從UITextView和NSLayoutManager獲取線路信息
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
,我可以計算行rects使用這種方法對NSLayoutManager
:
- (NSRect)boundingRectForGlyphRange:(NSRange)glyphRange inTextContainer:(NSTextContainer *)container
並給予lineRanges
我應該能夠計算使用一個點的行號(通過尋找包含字形指數lineRange
:
- (NSUInteger)glyphIndexForPoint:(CGPoint)point inTextContainer:(NSTextContainer *)container fractionOfDistanceThroughGlyph:(CGFloat *)partialFraction
所以剩下的是,如何得到一行的內容(作爲NSString
),給定一個行號?
你確定你需要這個協議,通常你可以設置NSTextStorage,NSLayoutManager和NSTextContainer,一切都會好的。我讀了關於它的好主題:http://www.raywenderlich.com/50151/text-kit-tutorial。 – kaspartus
不幸的是。在啓用VoiceOver時,UITextView似乎不會逐行讀出。至少不是在我的實現中(嵌入在UITableViewCells中的UITextViews) –
'NSLayoutManager'提供了與glyph範圍一起工作的方法,以及characer範圍的方法。最後有兩種方法允許你在這兩個範圍之間進行轉換:' - [NSLayoutManager glyphRangeForCharacterRange:actualCharacterRange:]'和' - [NSLayoutManager characterRangeForGlyphRange:actualGlyphRange:]''。要檢索字符串,只需將您感興趣的glyphRange轉換爲characterRange,然後就可以從'UITextView'的'textStorage'使用'attributedSubstringFromRange:'或'string'和'substringWithRange:'來檢索一個子字符串。 – Dalzhim