textView段落中的超链接/ URL

时间:2015-04-21 20:04:49

标签: ios iphone swift url hyperlink

我有一个段落,它是一个textView。我想在段落中的一些单词中加入超链接。

enter image description here

var attributedString = NSMutableAttributedString(string: text)
attributedString.addAttribute(NSLinkAttributeName, value: hyperlink, range: range)

var linkAttributes = [NSForegroundColorAttributeName: UIColor.blueColor(),
            NSUnderlineStyleAttributeName: 1
        ]

textView!.linkTextAttributes = linkAttributes        
textView!.attributedText = attributedString
textView!.delegate = self

UITextViewDelegate

func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
    if UIApplication.sharedApplication().canOpenURL(URL) {
        return true
    } else {
        CozyStyles.alert(title: "Sorry", message: (URL.scheme!).capitalizeFirst + " is not installed", action: "OK")
        return false
    }
}

这种方法有效,但效果不好。简单录音时,它无法识别textView点击。必须长按该链接才能使其工作,这对用户不友好。

有解决方法吗?

  • This解决方案也不起作用,因为我有另一个轻击手势。

2 个答案:

答案 0 :(得分:0)

与您提供的链接类似的其他点按手势解决方案应该有效,即使您当前有另一个点按手势。

如果你的textView位于视图层次结构的顶部,那么添加到textView的附加手势识别器应该只识别点击。

如果您现有的点按手势被添加到textView顶部的视图中,您可以实现UIGestureRecognizerDelegate的shouldReceiveTouch方法,并在您点击它时处理文本视图,同时拒绝手势接收触摸。 如果是这种情况,那么您甚至可能不需要额外的手势:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    CGPoint location = [touch locationInView:self.view];
    if (CGRectContainsPoint(self.textView.frame, location)) {
        [self handleTapOnTextViewAtLocation:[self.view convertPoint:location toView:self.textView]];
        return NO;
    }
    return YES;
}

- (void)handleTapOnTextViewAtLocation:(CGPoint)location {
    UITextPosition *textPosition = [self.textView closestPositionToPoint:location];
    NSDictionary *textStyling = [self.textView textStylingAtPosition:textPosition inDirection:UITextStorageDirectionForward];
    NSURL *url = textStyling[NSLinkAttributeName];
    if (url) {
        NSLog(@"url tapped: %@", url);
    }
}

答案 1 :(得分:0)

使用此代码:

textView.dataDetectorTypes = UIDataDetectorTypeLink;