Clicking on NSURL in a UITextView

后端 未结 3 1647
既然无缘
既然无缘 2020-12-17 03:55

I have a UITextView that spans 100.0 points across my UIView.

In the UITextView, I have links that get captured with the follo

相关标签:
3条回答
  • 2020-12-17 04:40

    As Tamás Zahola suggested in previous answer, you can fix this issue by adding "dummy" URLs before and after real URL. But, instead using whitespace in dummy link, use zero width space unicode character:

    NSAttributedString* dummyUrl = [[NSAttributedString alloc] initWithString:@"\u200B" attributes:@{ NSLinkAttributeName : @"http://dummy.com" }];
    [attributedString appendAttributedString:dummyUrl];
    [attributedString appendAttributedString:url];
    [attributedString appendAttributedString:dummyUrl];
    
    0 讨论(0)
  • 2020-12-17 04:42

    You simply need to set some properties after linking that textView to code like textview delegate, editable and dataDetectorTypes

    Below i have added the content i have used

    Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson3.html Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. http://stackoverflow.com Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda http://stackoverflow.com

    for objective-c

    textView.delegate=self:
    textView.editable = NO;  
    textView.dataDetectorTypes = UIDataDetectorTypeLink;
    
    
    - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
       return true;
    

    }

    for Swift

    textView1.delegate=self
    textView1.editable = false
    textView1.dataDetectorTypes = UIDataDetectorTypes.Link
    
    func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
        return true
    }
    
    0 讨论(0)
  • 2020-12-17 04:53

    For me it only highlights the link... Am I missing something?

    Update:

    Here's a really hacky solution via dummy URL's:

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        NSMutableAttributedString* attributedString = [[NSMutableAttributedString alloc] init];
        [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"Lorem ipsum dolor sit amet, vim iuvaret blandit intellegebat ut. Solet diceret interpretaris eos cu, magna dicat explicari mei ex, cibo adversarium eu pro. Ei odio saepe eloquentiam cum, nisl case nec ut. Harum habemus definiebas et vix, est cu aeque sonet, in his salutatus repudiare deterruisset. Quo duis autem intellegat an, regione propriae et vis."]];
    
        NSAttributedString* dummyUrl = [[NSAttributedString alloc] initWithString:@" " attributes:@{ NSLinkAttributeName : @"http://dummy.com" }];
        NSAttributedString* url = [[NSAttributedString alloc] initWithString:@"http://stackoverflow.com" attributes:@{ NSLinkAttributeName : @"http://stackoverflow.com" }];
        [attributedString appendAttributedString:dummyUrl];
        [attributedString appendAttributedString:url];
        [attributedString appendAttributedString:dummyUrl];
        self.textView.attributedText = attributedString;
    }
    
    - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
        return ![URL.absoluteString isEqualToString:@"http://dummy.com"];
    }
    

    Basically you force the UITextView to recognise the tap before and after the stackoverflow link as the dummy link. Since it's just a space it's invisible, however unfortunately if you tap and hold before/after the stackoverflow link you'll see the space highlighted with gray, despite shouldInteractWithURL returning NO. Unfortunately it seems you cannot circumvent this behaviour unless you implement your own UITextField from scratch...

    0 讨论(0)
提交回复
热议问题