Để hỗ trợ giao thức UIAccessibilityReadingContent
, tôi cần UITextView của tôi trả lời cho tôi các câu hỏi về các dòng của nó. Đây là những phương pháp của giao thức mà tôi cần phải thực hiện:Lấy thông tin về dòng từ UITextView và NSLayoutManager
accessibilityLineNumberForPoint:
< - Cung cấp một phối hợp, trả lại một số dòngaccessibilityContentForLineNumber:
< - Trả lại văn bản của một đường thẳng cho trướcaccessibilityFrameForLineNumber:
< - Với một số dòng, trả lại khung của nóaccessibilityPageContent
< - Toàn bộ nội dung văn bản. Mà tôi có. :)
Tôi cho rằng NSLayoutManager có thể giúp tôi, nhưng tôi không có kinh nghiệm với nó. Tôi đã tìm ra một số (tôi nghĩ), nhưng vẫn cần một số trợ giúp.
Apple có một số mẫu mã (here) có thể làm cho tôi số dòng trong giao diện văn bản:
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);
}
Tôi hình dung rằng với lineRange
trên, tôi có thể tính toán dòng dễ phân biệt bằng phương pháp này trên NSLayoutManager
:
- (NSRect)boundingRectForGlyphRange:(NSRange)glyphRange inTextContainer:(NSTextContainer *)container
Và cho lineRanges
tôi nên có thể tính toán số dòng cho một điểm sử dụng (bằng cách tìm các lineRange
có chứa chỉ số glyph:
- (NSUInteger)glyphIndexForPoint:(CGPoint)point inTextContainer:(NSTextContainer *)container fractionOfDistanceThroughGlyph:(CGFloat *)partialFraction
Vì vậy, phần còn lại là gì, làm cách nào để lấy nội dung của một dòng (như là NSString
), được cung cấp một số dòng?
Bạn có chắc chắn rằng bạn cần giao thức đó, trong trường hợp phổ biến bạn chỉ có thể đặt NSTextStorage, NSLayoutManager và NSTextContainer và mọi thứ sẽ ổn. Tôi đọc chủ đề tuyệt vời về nó: http://www.raywenderlich.com/50151/text-kit-tutorial. – kaspartus
Thật không may là có. UITextView dường như không cung cấp từng dòng đọc ra khỏi hộp khi VoiceOver được bật. Ít nhất là không phải trong thực hiện của tôi (UITextViews nhúng trong UITableViewCells) –
'NSLayoutManager' cung cấp các phương thức làm việc với các phạm vi glyph, cũng như các phương thức cho các phạm vi characer. Cuối cùng có hai phương thức cho phép bạn chuyển đổi giữa hai phạm vi đó: '- [NSLayoutManager glyphRangeForCharacterRange: actualCharacterRange:]' và '- [NSLayoutManager characterRangeForGlyphRange: actualGlyphRange:]'. Để lấy chuỗi, chỉ cần chuyển đổi glyphRange mà bạn quan tâm thành một characterRange, sau đó bạn có thể lấy một chuỗi con từ 'textStorage' của' UITextView' bằng cách sử dụng 'attributedSubstringFromRange:' hoặc cả 'string' và' substringWithRange: '. – Dalzhim