首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ASTextNode AsyncDisplayKit中检测链接或URL

在ASTextNode AsyncDisplayKit中检测链接或URL
EN

Stack Overflow用户
提问于 2016-04-11 12:50:47
回答 2查看 1.7K关注 0票数 4

我一直试图使用AsyncDisplayKit框架,我需要检测文本中的url。

我使用过ASTextNode,但找不到任何api来检测链接。

我读到有属性linkAttributeNames用于url检测,但无法找到如何执行的任何示例。

有人能帮我怎样使用上面的课吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-12 16:05:06

斯威夫特3.0

代码语言:javascript
复制
func addLinkDetection(_ text: String, highLightColor: UIColor, delegate: ASTextNodeDelegate) {
    self.isUserInteractionEnabled = true
    self.delegate = delegate

    let types: NSTextCheckingResult.CheckingType = [.link]
    let detector = try? NSDataDetector(types: types.rawValue)
    let range = NSMakeRange(0, text.characters.count)
    if let attributedText = self.attributedText {
        let mutableString = NSMutableAttributedString()
        mutableString.append(attributedText)
        detector?.enumerateMatches(in: text, range: range) {
            (result, _, _) in
            if let fixedRange = result?.range {
                mutableString.addAttribute(NSUnderlineColorAttributeName, value: highLightColor, range: fixedRange)
                mutableString.addAttribute(NSLinkAttributeName, value: result?.url, range: fixedRange)
                mutableString.addAttribute(NSForegroundColorAttributeName, value: highLightColor, range: fixedRange)

            }
        }
        self.attributedText = mutableString
    }        
}

将委托添加到viewController中:

代码语言:javascript
复制
/// Delegate function for linkDetection
func textNode(_ textNode: ASTextNode, shouldHighlightLinkAttribute attribute: String, value: Any, at point: CGPoint) -> Bool {
    return true
}

func textNode(_ textNode: ASTextNode, tappedLinkAttribute attribute: String, value: Any, at point: CGPoint, textRange: NSRange) {
    guard let url = value as? URL else { return }
 }
票数 7
EN

Stack Overflow用户

发布于 2016-05-31 09:04:11

对于链接检测,您需要使用外部库。我建议您可以使用cocoapods安装https://github.com/twitter/twitter-text

然后,需要将TwitterTextEntity*转换为NSTextCheckingResult*。

您可以使用这类NSString:

代码语言:javascript
复制
- (NSArray <NSTextCheckingResult *>*)textCheckingResultsForURLs {
    NSArray *twitterEntitiesArray = [TwitterText URLsInText:self];
    NSMutableArray *textCheckingResultsArray = [[NSMutableArray alloc] initWithCapacity:[twitterEntitiesArray count]];

    for (TwitterTextEntity *twitterTextEntity in twitterEntitiesArray) {
        NSString *textCheckingResultUTF8 = [[self substringWithRange:twitterTextEntity.range] stringPercentEncode];

        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@", textCheckingResultUTF8]];

        NSTextCheckingResult *result = [NSTextCheckingResult linkCheckingResultWithRange:twitterTextEntity.range URL:url];
        [textCheckingResultsArray addObject:result];
    }

    return textCheckingResultsArray;
}

像这样使用它:

代码语言:javascript
复制
NSArray *links = [yourString textCheckingResultsForURLs];

然后,您需要向NSMutableAttributedString添加计算范围,如下所示:

代码语言:javascript
复制
for (NSTextCheckingResult *textCheckingResult in links) {

        NSMutableDictionary *linkAttributes = [[NSMutableDictionary alloc] initWithDictionary:@{NSForegroundColorAttributeName : [UIColor whiteColor]}];

        linkAttributes[@"TextLinkAttributeNameURL"] = [NSURL URLWithString:textCheckingResult.URL.absoluteString];

        [string addAttributes:linkAttributes range:textCheckingResult.range];
    }

然后,您需要配置ASTextNode节点以突出显示特定的范围。因此,在父节点中添加:

代码语言:javascript
复制
_textLabelNode.delegate = self;
_textLabelNode.userInteractionEnabled = YES;
_textLabelNode.linkAttributeNames = @[@"TextLinkAttributeNameURL"];

+

代码语言:javascript
复制
- (void)didLoad {
    // For text node
    self.layer.as_allowsHighlightDrawing = YES;

    [super didLoad];
}

#pragma mark - ASTextNodeDelegate

- (BOOL)textNode:(ASTextNode *)richTextNode shouldHighlightLinkAttribute:(NSString *)attribute value:(id)value atPoint:(CGPoint)point {
    return YES;
}

- (void)textNode:(ASTextNode *)richTextNode tappedLinkAttribute:(NSString *)attribute value:(NSURL *)URL atPoint:(CGPoint)point textRange:(NSRange)textRange {
NSLog(@"TODO");
}

这对我有用。霍普什么都没忘。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36549214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档