在 UITextView 的一个单词中长按获取单词

Posted

技术标签:

【中文标题】在 UITextView 的一个单词中长按获取单词【英文标题】:Get word from long tap in a word of UITextView 【发布时间】:2012-07-05 17:29:06 【问题描述】:

现在我已经在 UITextView 中检测到长按

    - (void)viewDidLoad
    
         [super viewDidLoad];
         UILongPressGestureRecognizer *LongPressgesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressFrom:)];    
         [[self textview] addGestureRecognizer:LongPressgesture];
         longPressGestureRecognizer.delegate = self;
    
    - (void) handleLongPressFrom: (UISwipeGestureRecognizer *)recognizer
    
         CGPoint location = [recognizer locationInView:self.view];

         NSLog(@"Tap Gesture Coordinates: %.2f %.2f", location.x, location.y);
    

现在,我应该如何获取长按的单词内容,并获取该单词的矩形以准备显示 PopOver?

【问题讨论】:

请查看***.com/questions/8811909/…。我用过UITapGestureRecognizer,你可以用UILongPressGestureRecognizer替换它。 【参考方案1】:

此函数将返回 UITextView 中给定位置的单词。

+(NSString*)getWordAtPosition:(CGPoint)pos inTextView:(UITextView*)_tv

    //eliminate scroll offset
    pos.y += _tv.contentOffset.y;

    //get location in text from textposition at point
    UITextPosition *tapPos = [_tv closestPositionToPoint:pos];

    //fetch the word at this position (or nil, if not available)
    UITextRange * wr = [_tv.tokenizer rangeEnclosingPosition:tapPos withGranularity:UITextGranularityWord inDirection:UITextLayoutDirectionRight];

    return [_tv textInRange:wr];

【讨论】:

您可能想查看文本视图的tokenizer 属性的rangeEnclosingPosition:withGranularity:inDirection: 方法。 谢谢 rob,这让事情变得简单多了!我已经编辑了答案以包含您的建议。 有没有办法像获取单词的位置一样向后执行此操作? @TheDeveloper UITextInput 协议提供了一个函数,如果我想知道 UITextView 的特定偏移量(即字符串中的字符位置)的 UITextPosition:positionFromPosition:(UITextPosition *)startPosition offset:(NSInteger)offset。 startPosition 可以是tv.beginningOfDocument(如果您的Textview 被命名为'tv')并且偏移量是字符串中单词的位置,作为文本分配给textview。要在返回位置获取布局点,请使用来自caretRectForPosition: 的矩形原点【参考方案2】:

SWIFT 4

为了您的方便,用 swift 写了一份@cayeric 的答案。

func getWord(at position: CGPoint, in textView: UITextView) -> String?
    var point = position

    //eliminate scroll offset
    point.y += textView.contentOffset.y

    //get location in text from textposition at point
    guard let tapPos = textView.closestPosition(to: point) else 
        return nil
    

    //fetch the word at this position (or nil, if not available)
    guard let wordRange = textView.tokenizer.rangeEnclosingPosition(tapPos, with: .word, inDirection: UITextWritingDirection.rightToLeft.rawValue) else 
        return nil
    

    return textView.text(in: wordRange)

【讨论】:

以上是关于在 UITextView 的一个单词中长按获取单词的主要内容,如果未能解决你的问题,请参考以下文章

如何从点击的单词 UITextview 中获取字符范围

从 UITextView 中的点击获取单词

Swift 4:如何在UITextView中每行只设置一个单词,并为每行创建一个数组

如何在 Swift 中制作一个单词可点击的 UITextView?

在 UITextView 中定义后取消选择单词

从 UITextView 获取文本