如何找到文本视图中的任何单词的位置或得到矩形并在其上放置按钮?

时间:2012-04-25 10:18:49

标签: iphone objective-c position character uitextview

我正在开发一个故事app.Where我们需要提供quizes。 现在我有一个故事,这个故事有一些空白或隐藏的话。 每当我点击隐藏的单词时,我都会得到4个选项来回答这个问题。 我尝试将按钮放在单词上,但那只会在我使用静态时 位置。 我只想知道如何获得该词的框架,我需要隐藏它,以便 我可以在上面放一些按钮,可以隐藏它。

您可以看到下面的图片。enter image description here 所有答案将不胜感激

解决方案: - 这将在iOS 5之后仅在低于该值的情况下工作!

- (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];



}

由于

查看另外一张图片以查找错误: enter image description here

4 个答案:

答案 0 :(得分:18)

UITextView采用UITextInput协议。该协议具有方法-firstRectForRange:,它将告诉您覆盖一系列字符的矩形。如果字符范围跨越多行,则必须重复调用它。它第一次会给你第一个矩形并告诉你覆盖的范围。然后,您调整您要求的剩余字符范围并重复。

答案 1 :(得分:2)

-(void)textViewDidChangeSelection:(UITextView *)textView
 {
  NSRange range = textView.selectedRange;
 if(range.location<textView.text.length)
  {
    NSString * firstHalfString = [txtView.text substringToIndex:range.location];

    NSString *temp = @"s";
    CGSize s1 = [temp sizeWithFont:[UIFont systemFontOfSize:15] 
                          constrainedToSize:CGSizeMake(self.view.bounds.size.width - 40, MAXFLOAT)  // - 40 For cell padding
                              lineBreakMode:UILineBreakModeWordWrap]; // enter you textview font size

    CGSize s = [firstHalfString sizeWithFont:[UIFont systemFontOfSize:15] 
                           constrainedToSize:CGSizeMake(self.view.bounds.size.width - 40, MAXFLOAT)  // - 40 For cell padding
                               lineBreakMode:UILineBreakModeWordWrap]; // enter you textview font size


    //Here is the frame of your word in text view.
    NSLog(@"xcoordinate=%f, ycoordinate =%f, width=%f,height=%f",s.width,s.height,s1.width,s1.height);

     CGRect rectforword = CGRectMake(s.width, s.height, s1.width, s1.height);
    // rectforword is rect of yourword


    }
    else
    {
        // Do what ever you want to do

     }   
}

<强>&GT;&GT;&GT;被修改...

当你选择或点击textview文本时调用此方法,但你可以在任何UITextView中使用此方法Delegate方法

希望,这会帮助你......享受

答案 2 :(得分:2)

Ken Thomases&#39; 回答之后,从iOS 6开始,UITextInput协议包含以下方法:

- (NSArray *)selectionRectsForRange:(UITextRange *)range

See the reference doc)。

结果是一个UITextSelectionRect的数组,它有一堆关于文本中选择范围的信息...根据你想要如何使用文本块的部分,上面的方法可能是有用的

UITextSelectionRect reference)。

注意:根据我对UITextView的使用情况,返回的UITextSelectionRect数组包含可能被解释为的另外两个选择集。这些是数组中的最后两个选择集,我假设它们对应于选择的 start end 位置。这些选择对象的宽度均为0,并且相应地设置了containsStart / containsEnd属性。

答案 3 :(得分:0)

<块引用>

就我而言,添加“layoutIfNeeded”有帮助。

    textView.superview?.layoutIfNeeded()
    let beginning = textView.beginningOfDocument
    let start = textView.position(from: beginning, offset: range.location)
    let end = textView.position(from: start!, offset: range.length)
    let textRange = textView.textRange(from: start!, to: end!)
    let frame = textView.firstRect(for: textRange!)