2016-04-11 6 views
2

Ich habe versucht, AsyncDisplayKit Framework zu verwenden, ich habe eine Anforderung, URLs in Text zu erkennen.Detect Link oder URL in ASTextNode AsyncDisplayKit

Ich habe ASTextNode verwendet, konnte aber keine API zum Erkennen von Links finden.

Ich lese, dass es Eigenschaft linkAttributeNames für die URL-Erkennung verwendet, aber kein Beispiel finden, wie es geht.

Könnte jemand mir helfen, die oben genannte Klasse zu benutzen?

dank

Antwort

4

Für Swift 3,0

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 
    }   
} 

Fügen Sie den Delegierten zu Ihrem Viewcontroller:

/// 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 } 
} 
1

Für Link-Erkennung benötigen Sie externe Bibliothek verwenden. Ich würde empfehlen https://github.com/twitter/twitter-text Sie können es mit Cocoapods installieren.

Dann müssen Sie TwitterTextEntity * zu NSTextCheckingResult * konvertieren.

können Sie diese Kategorie von NSString verwenden:

- (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; 
} 

es wie folgt verwendet:

NSArray *links = [yourString textCheckingResultsForURLs]; 

Dann müssen Sie berechnet Bereiche NSMutableAttributedString wie folgt hinzu:

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]; 
    } 

Dann müssen Sie den ASTextNode-Knoten konfigurieren, um bestimmte Bereiche hervorzuheben. So in übergeordneten Knoten hinzufügen:

_textLabelNode.delegate = self; 
_textLabelNode.userInteractionEnabled = YES; 
_textLabelNode.linkAttributeNames = @[@"TextLinkAttributeNameURL"]; 

+

- (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"); 
} 

Dies funktioniert für mich. Hoffe, habe nichts vergessen.