我需要在文本视图中找到不同范围的像素帧。我正在使用- (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
协议,必须对UITextRange
和UITextPosition
进行子类化。我没有这样做,但我还是尝试了,遵循文档的示例代码,并将子类传递给firstRectForRange
,这导致了崩溃。
如果有更简单的方法将不同颜色的UILables
添加到文本视图中,请告诉我。我尝试过在content editable
设置为TRUE的情况下使用UIWebView,但我不喜欢与JS通信,而着色是我唯一需要的东西。
提前谢谢。
发布于 2012-03-08 01:36:21
您可以使用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];
}
发布于 2013-10-06 04:13:30
看起来如此复杂,这有点可笑。一个简单的“变通办法”是选择范围(接受NSRange),然后读取selectedTextRange (返回UITextRange):
- (CGRect)frameOfTextRange:(NSRange)range inTextView:(UITextView *)textView {
textView.selectedRange = range;
UITextRange *textRange = [textView selectedTextRange];
CGRect rect = [textView firstRectForRange:textRange];
return rect;
}
这对我来说很有效,即使textView不是第一响应者。
如果您不希望选择保持不变,则可以重置selectedRange:
textView.selectedRange = NSMakeRange(0, 0);
...or保存当前选择并在以后恢复它
NSRange oldRange = textView.selectedRange;
// do something
// then check if the range is still valid and
textView.selectedRange = oldRange;
发布于 2017-09-18 05:08:58
Andrew Schreiber的Swift 4简单复制/粘贴的答案
extension NSRange {
func toTextRange(textInput:UITextInput) -> UITextRange? {
if let rangeStart = textInput.position(from: textInput.beginningOfDocument, offset: location),
let rangeEnd = textInput.position(from: rangeStart, offset: length) {
return textInput.textRange(from: rangeStart, to: rangeEnd)
}
return nil
}
}
https://stackoverflow.com/questions/9126709
复制相似问题