15

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

您可以看到下面的图片。在此处输入图像描述 所有答案将不胜感激

解决方案:- 这将在 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];



}

谢谢

再看一张图片以了解错误: 在此处输入图像描述

4

4 回答 4

19

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

于 2012-04-25T11:24:37.680 回答
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

     }   
}

>>>编辑...

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

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

于 2012-04-25T10:53:16.930 回答
2

Ken Thomases 的回答之后,从 iOS 6 开始,UITextInput协议包括以下方法:

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

请参阅参考文档)。

结果是一个UITextSelectionRects 数组,其中包含大量有关文本中选择范围的信息...根据您希望如何使用文本块的矩形,上述方法可能很有用。

UITextSelectionRect 参考)。

注意:根据我的用法UITextView,返回的 s 数组UITextSelectionRect包含可能被解释为两个额外的选择矩形。这些是数组中的最后两个选择矩形,我假设它们对应于选择的开始结束位置。这些选择矩形的宽度分别为0,并且containsStart/containsEnd属性也相应设置。

于 2014-03-25T14:07:55.213 回答
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!)
于 2021-08-10T08:18:02.013 回答