gpt4 book ai didi

ios - 获取核心文本中点击字符的索引

转载 作者:行者123 更新时间:2023-11-29 01:29:08 29 4
gpt4 key购买 nike

我需要能够可靠地获取 Core Text 框架中点击字符的索引。我有这段代码,它可靠地得到了正确的行,但它在点击索引上从零到 2 个字符。错误总是向前的;也就是说,它在正确索引之前获取索引 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;
}

最佳答案

你试过把它放在 UITextView 中并做类似的事情吗

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

关于ios - 获取核心文本中点击字符的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33637563/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com