为了支持UIAccessibilityReadingContent
协议,我需要我的UITextView来回答有关其行的问题。这些是我需要实现的协议的方法:
accessibilityLineNumberForPoint:
< - 提供坐标,返回行号accessibilityContentForLineNumber:
< - 返回给定行的文字accessibilityFrameForLineNumber:
< - 给定一个行号,返回其框架accessibilityPageContent
< - 整个文字内容。我有。 :)我认为NSLayoutManager可以帮助我,但我没有经验。我已经想出了一些(我认为),但仍需要一些帮助。
Apple提供了一些示例代码(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
)?
答案 0 :(得分:4)
在一个简单的解决方案中思考,这是一个重现您需要的小代码
- (void)analyse:(UITextView *)textView
{
NSLayoutManager *layoutManager = [textView layoutManager];
NSString *string = textView.text;
unsigned numberOfLines, index, stringLength = [string length];
NSMutableArray *ranges = [NSMutableArray new];
NSMutableArray *frames = [NSMutableArray new];
for (index = 0, numberOfLines = 0; index < stringLength; numberOfLines++)
{
NSRange tmprange;
NSRange range = [string lineRangeForRange:NSMakeRange(index, 0)];
CGRect rect = [layoutManager lineFragmentRectForGlyphAtIndex:index
effectiveRange:&tmprange];
[ranges addObject:[NSValue valueWithRange:range]];
[frames addObject:[NSValue valueWithCGRect:rect]];
index = NSMaxRange(range);
}
self.ranges = ranges;
self.frames = frames;
self.numberOfLines = numberOfLines;
}
请查看属性:
self.ranges = ranges;
self.frames = frames;
self.numberOfLines = numberOfLines;
您可以在班级中创建以下属性:
@property (nonatomic) NSInteger numberOfLines;
@property (strong, nonatomic) NSArray *ranges;
@property (strong, nonatomic) NSArray *frames;
我建议你在以下代理中添加analyze调用:
- (void)textViewDidChange:(UITextView *)textView
你可以在分析后得到第二行的框架: self.frames [1]
或者获取第二行的文本: [textView.text substringWithRange:[self.ranges [1] rangeValue]]
例如:
if (self.numberOfLines > 1)
{
NSRange range = [self.ranges[1] rangeValue];
NSLog(@"2nd line = %@", [textView.text substringWithRange:range]);
NSLog(@"2nd line frame = %@", self.frames[1]);
}
拥有 self.frames 中的所有框架,我认为您可以轻松地执行其他操作,使用坐标猜测行号。