我需要在文本视图中找到不同范围的像素帧.我用- (CGRect)firstRectForRange:(UITextRange *)range;来做.但是我不知道如何创建一个UITextRange.

基本上这就是我想要的:

- (CGRect)frameOfTextRange:(NSRange)range inTextView:(UITextView *)textView {

    UITextRange*range2 = [UITextRange rangeWithNSRange:range]; //DOES NOT EXIST 
    CGRect rect = [textView firstRectForRange:range2];
    return rect;
}

苹果公司表示,要采用UITextInput协议,必须将其分为UITextRangeUITextPosition子类.我没有这样做,但我还是try 了,遵循doc的示例代码,并将子类传递给firstRectForRange,结果导致崩溃.

如果有更简单的方法在文本视图中添加不同 colored颜色 的UILables,请告诉我.我曾try 使用UIWebView,content editable设置为TRUE,但我不喜欢与JS交流,我只需要着色.

提前谢谢.

推荐答案

可以使用方法textRangeFromPosition:toPosition创建文本范围.这种方法需要两个位置,所以你需要计算范围的起点和终点的位置.这是通过方法positionFromPosition:offset完成的,该方法返回来自另一个位置的位置和字符偏移量.

- (CGRect)frameOfTextRange:(NSRange)range inTextView:(UITextView *)textView
{
    UITextPosition *beginning = textView.beginningOfDocument;
    UITextPosition *start = [textView positionFromPosition:beginning offset:range.location];
    UITextPosition *end = [textView positionFromPosition:start offset:range.length];
    UITextRange *textRange = [textView textRangeFromPosition:start toPosition:end];
    CGRect rect = [textView firstRectForRange:textRange];
    return [textView convertRect:rect fromView:textView.textInputView];
}

Objective-c相关问答推荐

在 MacOS 上截屏

UITextField secureTextEntry 带有自定义字体的项目符号?

将 NSNumber 转换为 NSDecimalNumber

如果安装了应用程序,如何以编程方式判断?

无法编译连接:错误是什么意思?

混合 Objective-C 和 C++

NSMutableArray 判断对象是否已经存在

Objective-C:如何使用 BOOL 类型的参数调用 performSelector?

UIViewController 的 prefersStatusBarHidden 不起作用

如何在 UIImageView 中显示 base64 图像?

如何推送两个视图控制器但只为第二个设置动画过渡?

替换 URL 中出现的空格

Modal segue,导航栏消失

如何检测 NSString 是否为空?

UIDatePicker 中的最小和最大日期

-fembed-bitcode 在 6.0 之前的 iOS 版本上不受支持

如何判断 NSString 的最后一个字符

Xcode没有编译任何项目? 'clang 失败,退出代码 255'

带有Go按钮而不是返回的 iOS 键盘

使用 [NSDate date] 获取当前日期和时间