Hyperlinks in a UITextView

后端 未结 5 1083
無奈伤痛
無奈伤痛 2020-12-01 16:18

I am trying to create a UITextView with a hyperlink so that when the user clicks on the link, they are taken to safari to open the we

相关标签:
5条回答
  • 2020-12-01 16:53

    This code sample has two different links in the same label and URL color is set to avoid the default blue.

    UITextView * textTerm = [UITextView new];
    NSMutableAttributedString *attrRight = [[NSMutableAttributedString alloc] initWithString:@"Terms of Service"
                                                                           attributes:@{ NSLinkAttributeName: [NSURL URLWithString:@"http://www.google.com"] }];
    NSMutableAttributedString *attrLeft = [[NSMutableAttributedString alloc] initWithString:@"Privacy Policy"
                                                                           attributes:@{ NSLinkAttributeName: [NSURL URLWithString:@"http://www.google.com"] }];
    [attrRight appendAttributedString:attrLeft];
    textTerm.attributedText = attrRight;
    textTerm.editable = NO;
    textTerm.dataDetectorTypes = UIDataDetectorTypeAll;
    textTerm.linkTextAttributes = [UIColor whiteColor];
    textTerm.backgroundColor = [UIColor clearColor];
    
    0 讨论(0)
  • 2020-12-01 16:58

    if you want active substring in your UITextView then you can use my extended TextView... its short and simple. You can edit it as you want.

    how to use (range = substring location):

    [self.textView addTapActionWithRange:range withActionBlock:^{
          // anything you want to do - show something
    }];
    

    result:

    source code: https://github.com/marekmand/ActiveSubstringTextView

    0 讨论(0)
  • 2020-12-01 16:59

    Use NSAttributedString

    NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:@"Google" 
                                                                           attributes:@{ NSLinkAttributeName: [NSURL URLWithString:@"http://www.google.com"] }];
    self.textView.attributedText = attributedString;
    

    Sure, you can set just a portion of the text to be the link. Please read more about the NSAttributedString here.

    If you want to have more control and do something before opening the link. You can set the delegate to the UITextView.

    - (void)viewDidLoad {
        ...
        self.textView.delegate = self; // self must conform to UITextViewDelegate protocol
    }
    
    ...
    
    - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
        // Do whatever you want here
        NSLog(@"%@", URL); // URL is an instance of NSURL of the tapped link
        return YES; // Return NO if you don't want iOS to open the link
    }
    
    0 讨论(0)
  • 2020-12-01 17:02

    Swift 3, iOS10 , Xcode 9

    @sikhapol's answer is really nice if you knew exactly the words you want to parse like "word dictionary" some how

    it's all about the string it self that displayed in UITextView

    My solution is based the text rendering if you make the UITextView render an html tags you may use href tag

    Here is some Code references you may use

    first you need to configure UITextView from interface builder or form code to

    1. Selectable
    2. Data detectores

    Note : do not make the textview editable

    Interface builder

    programmatically

             let htmlData = NSString(string: "go to <a href=\"http://www.google.com\">google</a> and search for it").data(using: String.Encoding.unicode.rawValue)
    
    
            let attributedString = try! NSAttributedString(data: htmlData!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)
            yourUIViewView.isSelectable = true
            yourUIViewView.dataDetectorTypes = .link
            yourUIViewView.attributedText = attributedString
            yourUIViewView.delegate = self
    

    for the UITextViewDelegate

        func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
        
           // check for the url string for performing your own custom actions here
          let urlString = URL.absoluteString
        
           // Return NO if you don't want iOS to open the link
            return true
         }
    
    0 讨论(0)
  • 2020-12-01 17:04

    A nifty little extension that I wrote and use (Swift 4.2, tested on iOS 12.1)

    extension NSAttributedString {
        func replace(placeholder: String, with hyperlink: String, url: String) -> NSAttributedString {
            let mutableAttr = NSMutableAttributedString(attributedString: self)
    
            let hyperlinkAttr = NSAttributedString(string: hyperlink, attributes: [NSAttributedString.Key.link: URL(string: url)!])
    
            let placeholderRange = (self.string as NSString).range(of: placeholder)
    
            mutableAttr.replaceCharacters(in: placeholderRange, with: hyperlinkAttr)
            return mutableAttr
        }
    }
    

    Usage:

    //Set through code or through interface builder
    footerText.isSelectable = true
    footerText.dataDetectorTypes = .link
    
    //Keeps the original formatting from xib or storyboard
    footerText.text = "By continuing, you are indicating that you accept our @Terms@ and @Privacy@."
    footerText.attributedText = footerText.attributedText?
            .replace(placeholder: "@Terms@", with: "Terms and Conditions", url: AppUrl.terms)
            .replace(placeholder: "@Privacy@", with: "Privacy Policy", url: AppUrl.privacy)
    
    0 讨论(0)
提交回复
热议问题