我有一个段落,它是一个textView。我想在段落中的一些单词中加入超链接。
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点击。必须长按该链接才能使其工作,这对用户不友好。
有解决方法吗?
答案 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;