2015-11-10 2 views
0

Мне нужно надежно получить индекс отраженного символа в фрейме основного текста. У меня есть этот код, который надежно получает правильную строку, но которая отключена от нуля до двух символов на указанном индексе. Ошибка всегда вперед; то есть он получает индекс от 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; 
} 
+0

Оказывается, что этот метод лучше всего работает с оправданным текстом, а не слева выровненным текстом. Кроме того, идентификатор в начале абзаца отбрасывает его для первой строки. Есть ли надежный способ сделать это? –

ответ

1

Вы пытались поместить его в UITextView и делать что-то вроде

UITextPosition *touchPosition = [self.textView closestPositionToPoint:point]; 
    UITextRange *touchRange = [self.textView.tokenizer rangeEnclosingPosition:touchPosition withGranularity:UITextGranularityCharacter inDirection:UITextLayoutDirectionRight]; 
    NSLog(@"%@",[self.textView textInRange: touchRange]); 
+0

Hi beyowulf, спасибо за предложение. Это похоже на хороший подход к откату, если я не могу заставить его работать последовательно из рамки Core Text. –

 Смежные вопросы

  • Нет связанных вопросов^_^