characterIndexForPoint 为相同的参数返回不同的结果

Epa*_*aga 4 cocoa-touch objective-c uigesturerecognizer textkit

我有一个连接到平移手势识别器的 UITextView。当我将手指拖到文本视图上时,我使用 characterIndexForPoint 方法来确定我的手指在哪个字符上,然后在该点突出显示文本。

在视图中的文本有换行符的某些情况下,即使我传入相同的参数,此方法似乎返回不同的结果。touch 方法被连续调用两次,一次 charIndex 是 167,然后是 270。

我检查了文本视图的 AttributedString 并且在两种情况下它的字体大小相同。

- (IBAction)touched:(UIPanGestureRecognizer *)sender {
    if (self.txtView.isFirstResponder) {
        return;
    }
    if (sender.state == UIGestureRecognizerStateChanged) {

        CGPoint touchPoint = [sender locationInView:self.txtView];
        NSUInteger charIndex = [self.txtView.layoutManager
                     characterIndexForPoint:touchPoint
                            inTextContainer:self.txtView.textContainer
   fractionOfDistanceBetweenInsertionPoints:0];
 ...
Run Code Online (Sandbox Code Playgroud)

这是一个已知的错误?难道我做错了什么?

Hol*_*lly 5

你做错的一件事是fractionOfDistanceBetweenInsertionPoints:不应该为零。它是一个结果参数,所以它应该是 a 的地址,CGFloat或者NULL如果你不在乎。

     CGPoint touchPoint = [sender locationInView:self.txtView];
     CGFloat fraction = 0;
     NSUInteger charIndex = [self.txtView.layoutManager
                  characterIndexForPoint:touchPoint
                         inTextContainer:self.txtView.textContainer
fractionOfDistanceBetweenInsertionPoints:&fraction];
Run Code Online (Sandbox Code Playgroud)

您可能对fractionOfDistanceBetweenInsertionPoints:后者不感兴趣,但它可能可以帮助您诊断此问题。你传递的观点可能不明确,它会帮助你看到这一点。