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

时间:2013-11-02 15:10:52

标签: objective-c cocoa-touch uigesturerecognizer textkit

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

在视图中的文本有换行符的某些情况下,即使我传入相同的参数,此方法似乎也会返回不同的结果。触摸的方法连续两次调用,一旦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];
 ...

这是一个已知的错误吗?我做错了吗?

1 个答案:

答案 0 :(得分:4)

你做错的一件事是fractionOfDistanceBetweenInsertionPoints:不应该为零。它是一个结果参数,因此如果您不关心,它应该是CGFloatNULL的地址。

     CGPoint touchPoint = [sender locationInView:self.txtView];
     CGFloat fraction = 0;
     NSUInteger charIndex = [self.txtView.layoutManager
                  characterIndexForPoint:touchPoint
                         inTextContainer:self.txtView.textContainer
fractionOfDistanceBetweenInsertionPoints:&fraction];

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