Ответ 1
думая в простом решении, вот небольшой код, который воспроизводит то, что вам нужно
- (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(tmpRange);
}
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;
Я предлагаю вам добавить вызов анализа в следующий делегат:
- (void)textViewDidChange:(UITextView *)textView
Там вы можете, например, после анализа получить кадр 2-й строки, просто выполнив: 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 Я думаю, что вы можете легко сделать другое, угадать номер строки, используя координату.