如何检测UITextView中下划线的点击?

时间:2017-08-27 04:54:08

标签: ios objective-c

我有一个UITextView,其中某些单词被下划线替换,以填补空白效果。我在检测这些“空白”上的水龙头时遇到了困难。我到目前为止所尝试的是使用rangeEnclosingPosition获取单词的范围,并将粒度设置为Word,但看起来它不能识别特殊字符上的点击。现在,我希望给我的'下划线'字符串自定义属性,这样我就可以查看被点击的单词是否有任何自定义属性集。任何想法都会非常有用。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用 UITextViewDelegate 方法 -   textViewDidChangeSelection ,当文本视图中插入符号的位置发生变化时会收到通知,如果插入符号当前位置的下一个字符是您的特殊字符,则会在此处显示逻辑。

答案 1 :(得分:0)

我是这样做的 -

将自定义属性添加到文本中的特殊字符。在我的情况下,我知道特殊字符将是所有下划线或那只是我正在寻找的。所以我以下面的方式添加了一个自定义属性 -

NSAttributedString* attributedString = [[NSAttributedString alloc] initWithString:underscoreString attributes:@{ @"yourCustomAttribute" : @"value", NSFontAttributeName : [ UIFont boldSystemFontOfSize:22.0] }];

要查找特殊字符的点按,请按以下方式添加UITapGestureRecognizer -

UITapGestureRecognizer *textViewTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedTextView:)];
textViewTapRecognizer.delegate = self;
[self.textView addGestureRecognizer:textViewTapRecognizer];

并按以下方式定义其选择器 -

-(void) tappedTextView:(UITapGestureRecognizer *)recognizer
{
UITextView *textView = (UITextView *)recognizer.view;

// Location of the tap in text-container coordinates

NSLayoutManager *layoutManager = textView.layoutManager;
CGPoint location = [recognizer locationInView:textView];
location.x -= textView.textContainerInset.left;
location.y -= textView.textContainerInset.top;

// Find the character that's been tapped on

NSUInteger characterIndex;
characterIndex = [layoutManager characterIndexForPoint:location
                                       inTextContainer:textView.textContainer
              fractionOfDistanceBetweenInsertionPoints:NULL];
NSString *value;
if (characterIndex < textView.textStorage.length) {
    NSRange range;
    value = [[textView.attributedText attribute:@"yourCustomAttribute" atIndex:characterIndex effectiveRange:&range] intValue];
    NSLog(@"%@, %lu, %lu", value, (unsigned long)range.location, (unsigned long)range.length);
}
}

如果您获得了某个值,则会点按您的特殊字符。可能有更好的方法来做到这一点,但这对我现在有用。