1

我试图UITextView characterRangeAtPoint在我的代码中使用文本视图UITextRanges中的一些CGPoints内容。然后我使用UITextPositions这些UITextRanges作为参数并用于UITextView offsetFromPosition: toPosition:获取偏移量。它在 iOS 6 中运行良好。但是当我在 iOS 7 中尝试它时,offset 0无论CGPoint我在 textview 中尝试什么,它总是返回给我。

这是代码:

// init the textview
textview = [[UITextView alloc] initWithFrame:CGRectMake(10, 50, 300, 500)];
textview.backgroundColor = [UIColor whiteColor];
[self.view addSubview:textview];

// load the txt file for testing  
NSError *error;
NSString *content = [[NSString alloc] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"test" ofType:@"txt"] encoding:NSUTF8StringEncoding error:&error];
if (error) {
    NSLog(@"load string error:%@", [error localizedFailureReason]);
    return;
}

// set the text and font
textview.text = content;
UIFont *font = [UIFont systemFontOfSize:18];
textview.font = font;

// get text range at point (100, 100) and string offset from the beginning to this point 
UITextRange *textrange = [textview characterRangeAtPoint: CGPointMake(100, 100)];
NSInteger offset = [textview offsetFromPosition:textview.beginningOfDocument toPosition:textrange.start];
NSLog(@"offset = %d", offset);

它返回的offset总是0. 为了测试是否是因为UITextView offsetFromPosition: toPosition:,我尝试了以下代码:

NSInteger offset1 = [textview offsetFromPosition:textview.beginningOfDocument toPosition:textview.endOfDocument];
NSLog(@"offset1 = %d", offset1);

它给了我offset1 = 5264,根据test.txt我使用的,这是正确的。所以问题是UITextRangetextview characterRangeAtPoint. 似乎在 IOS 7 中characterRangeAtPoint没有返回给定的正确文本范围CGPoint。所以textview offsetFromPosition: toPosition:无法返回正确的偏移量。

但我在 IOS 6 中使用了相同的代码,并且效果很好。我还检查了 的参考资料characterRangeAtPoint,但没有发现有用的信息。

有谁知道characterRangeAtPointIOS 7发生了什么?为了让它像在 IOS 6 中一样正常工作,我应该怎么做?

4

4 回答 4

1

我找到了解决此错误的方法,并发布了解决方案作为对此问题的回复。

这是一个复制粘贴:


这是一个 iOS 7 错误。characterRangeAtPoint:除非事先选择了文本,否则总是返回 nil。

作为一种解决方法,您可以事先调用setSelectedRange:or setSelectedTextRange:,但随后 textView 会突出显示您的选择。我想出了以下解决方案:

[textView select:textView];
[textView setSelectedTextRange:nil];

调用这两个方法后,characterRangeAtPoint:将按预期开始工作。

请注意,您只需要在textView初始化后调用一次。

于 2013-11-02T22:50:55.793 回答
1

设置你的 textview 的 setContentInset

试试这个代码

UITextRange *textrange = [textview characterRangeAtPoint: CGPointMake(100, 100)];
NSInteger offset = [textview offsetFromPosition:textview.beginningOfDocument toPosition:textrange.start];

[textview setContentInset:UIEdgeInsetsMake(-45, 0, 5,0)];

NSLog(@"offset = %d", offset);
于 2013-09-25T10:51:49.653 回答
1

我遇到了同样的问题。而且我发现 characterRangeAtPoint 不会返回值,除非在 IOS 7 的 TextView 中至少更改或选择了一次文本。我无法使此功能正常工作,所以我不得不避免使用它(我试图也设置 setContentInset 但没有运气)。这是我的解决方法。我相信你可以做出类似的东西来适应你的情况。

// get the beginning position of the current line.
NSRange pos = [textView.text rangeOfString:@"\n" options:NSBackwardsSearch range:NSMakeRange(0,textView.selectedRange.location)];
if (pos.location == NSNotFound) pos.location = 0; // if the text has only one line.
NSLog(@"pos = %d",pos.location);
于 2013-10-03T09:42:54.200 回答
0

我最近遇到了为 7.1.1 开发的相同问题(仍然没有修复......),并想分享我的简单解决方案。

我尝试了 Exile.90 所做的,但没有成功。

相反,我在情节提要中启用了文本选择,并在 viewDidLoad 期间禁用了它。没有选择发生,但受影响的功能现在对我来说很完美。

于 2014-07-07T23:50:18.057 回答