Мне нужно надежно получить индекс отраженного символа в фрейме основного текста. У меня есть этот код, который надежно получает правильную строку, но которая отключена от нуля до двух символов на указанном индексе. Ошибка всегда вперед; то есть он получает индекс от 1 до 2 символов перед правильным индексом. К началу длинного абзаца он обычно отключается на 2 символа; к концу, это обычно правильно. Мой текст - греческий текст в атрибутной строке, не уверен, что это имеет значение.получение индекса отраженного символа в основном тексте
Любая помощь была бы принята с благодарностью.
Спасибо.
- (void)receivedTap:(UITapGestureRecognizer*)recognizer
{
CGAffineTransform transform = CGAffineTransformMake(1, 0, 0, -1, 0, self.bounds.size.height);
CGPoint point = CGPointApplyAffineTransform([recognizer locationInView:self], transform);
// Getting all CTLines
CFArrayRef lines = CTFrameGetLines(textFrame);
CFIndex countOfLines = CFArrayGetCount(lines);
int lineNumber = 0;
for (CFIndex i = 0; i < countOfLines; i++) // For each CTLine
{
CTLineRef line = CFArrayGetValueAtIndex(lines, i);
CGRect lineRect = CGRectZero;
CGFloat ascent = 0, descent = 0;
// Calculating CTLine frame
CTFrameGetLineOrigins(textFrame, CFRangeMake(i, 1), &lineRect.origin);
lineRect.size.width = CTLineGetTypographicBounds(line, &ascent, &descent, NULL);
lineRect.size.width -= CTLineGetTrailingWhitespaceWidth(line);
lineRect.size.height = ascent + descent;
lineRect.origin.y -= descent;
lineRect = CGRectIntegral(lineRect);
if (! CGRectContainsPoint(lineRect, point)) {
lineNumber++;
continue;
}
NSLog(@"line is %d", lineNumber);
CFIndex touchedIndex = CTLineGetStringIndexForPosition(line, point);
NSInteger touchedIndexInt = (NSInteger)touchedIndex;
NSLog(@"found it : char %d", touchedIndexInt);
break;
}
Оказывается, что этот метод лучше всего работает с оправданным текстом, а не слева выровненным текстом. Кроме того, идентификатор в начале абзаца отбрасывает его для первой строки. Есть ли надежный способ сделать это? –