wake-up-neo.net

Wie kann ich einen anklickbaren Link in einem NSAttributedString erstellen?

Es ist trivial, Hyperlinks in einer UITextView anklickbar zu machen. Sie setzen einfach das Ankreuzfeld "Links erkennen" in der Ansicht in IB, und es werden HTTP-Links erkannt und in Hyperlinks umgewandelt. 

Dies bedeutet jedoch immer noch, dass der Benutzer den "rohen" Link sieht. RTF -Dateien und HTML ermöglichen es Ihnen, eine vom Benutzer lesbare Zeichenfolge mit einem Link "dahinter" einzurichten. 

Es ist einfach, attributierten Text in einer Textansicht (oder UILabel oder UITextField) zu installieren. Wenn der attributierte Text jedoch einen Link enthält, kann er nicht angeklickt werden.

Gibt es eine Möglichkeit, den lesbaren Text in einer UITextView, UILabel oder UITextField anklickbar zu machen?

Das Markup ist bei SO anders, aber hier ist die allgemeine Idee. Was ich will ist ein Text wie folgt:

Dieser Morph wurde mit Face Dancer erstellt. Klicken Sie hier, um ihn im App Store anzuzeigen.

Das einzige, was ich bekommen kann, ist folgendes:

Dieses Morph wurde mit Face Dancer erstellt. Klicken Sie auf http://example.com/facedancer , um es im App Store anzuzeigen.

164
Duncan C

Der Kern meiner Frage war, dass ich in Textansichten/Feldern/Beschriftungen anklickbare Links erstellen wollte, ohne eigenen Code schreiben zu müssen, um den Text zu bearbeiten und die Links hinzuzufügen. Ich wollte, dass es datengetrieben ist.

Ich habe endlich herausgefunden, wie es geht. Das Problem ist, dass IB eingebettete Links nicht berücksichtigt. 

Darüber hinaus können Sie mit der iOS-Version von NSAttributedString keinen Attribut-String aus einer RTF Datei initialisieren. Die OS X-Version von NSAttributedStringdoes hat einen Initialisierer, der eine RTF Datei als Eingabe verwendet.

NSAttributedString entspricht dem NSCoding-Protokoll, sodass Sie es in/aus NSData konvertieren können

Ich habe ein OS X-Befehlszeilentool erstellt, das eine RTF Datei als Eingabe verwendet und eine Datei mit der Erweiterung .data ausgibt, die die NSData von NSCoding enthält. Dann füge ich die .data-Datei in mein Projekt ein und füge ein paar Codezeilen hinzu, die den Text in die Ansicht laden. Der Code sieht folgendermaßen aus (dieses Projekt war in Swift):

/*
If we can load a file called "Dates.data" from the bundle and convert it to an attributed string,
install it in the dates field. The contents contain clickable links with custom URLS to select
each date.
*/
if
  let datesPath = NSBundle.mainBundle().pathForResource("Dates", ofType: "data"),
  let datesString = NSKeyedUnarchiver.unarchiveObjectWithFile(datesPath) as? NSAttributedString
{
  datesField.attributedText = datesString
}

Für Apps, die viel formatierten Text verwenden, erstelle ich eine Erstellungsregel, die Xcode mitteilt, dass alle .rtf-Dateien in einem bestimmten Ordner die Quelle sind und die .data-Dateien die Ausgabe sind. Sobald ich das getan habe, füge ich einfach .rtf-Dateien zum angegebenen Verzeichnis hinzu (oder bearbeite vorhandene Dateien), und der Erstellungsprozess stellt fest, dass sie neu sind/aktualisiert werden, führt das Befehlszeilenprogramm aus und kopiert die Dateien in das App-Paket. Es funktioniert wunderbar.

Ich habe einen Blogbeitrag geschrieben, der auf ein Beispielprojekt (Swift) verweist, das die Technik demonstriert. Sie können es hier sehen:

Anklickbare URLs in einem UITextField erstellen, die in Ihrer App geöffnet werden

12
Duncan C

Verwenden Sie NSMutableAttributedString

NSMutableAttributedString * str = [[NSMutableAttributedString alloc] initWithString:@"Google"];
[str addAttribute: NSLinkAttributeName value: @"http://www.google.com" range: NSMakeRange(0, str.length)];
yourTextView.attributedText = str;

Bearbeiten:

Hierbei geht es nicht direkt um die Frage, sondern nur um zu verdeutlichen, dass UITextField und UILabel keine öffnenden URLs unterstützen. Wenn Sie UILabel mit Links verwenden möchten, können Sie TTTAttributedLabel überprüfen. 

Sie sollten auch den dataDetectorTypes-Wert Ihrer UITextView auf UIDataDetectorTypeLink oder UIDataDetectorTypeAll setzen, um URLs zu öffnen, wenn Sie darauf klicken. Oder Sie können die Delegat-Methode verwenden, wie in den Kommentaren vorgeschlagen. 

139
ujell

Ich fand das wirklich nützlich, aber ich musste es an vielen Stellen tun, also habe ich meinen Ansatz in eine einfache Erweiterung von NSMutableAttributedString eingepackt:

Swift 3

extension NSMutableAttributedString {

    public func setAsLink(textToFind:String, linkURL:String) -> Bool {

        let foundRange = self.mutableString.range(of: textToFind)
        if foundRange.location != NSNotFound {
            self.addAttribute(.link, value: linkURL, range: foundRange)
            return true
        }
        return false
    }
}

Swift 2

import Foundation

extension NSMutableAttributedString {

   public func setAsLink(textToFind:String, linkURL:String) -> Bool {

       let foundRange = self.mutableString.rangeOfString(textToFind)
       if foundRange.location != NSNotFound {
           self.addAttribute(NSLinkAttributeName, value: linkURL, range: foundRange)
           return true
       }
       return false
   }
}

Verwendungsbeispiel:

let attributedString = NSMutableAttributedString(string:"I love stackoverflow!")
let linkWasSet = attributedString.setAsLink("stackoverflow", linkURL: "http://stackoverflow.com")

if linkWasSet {
    // adjust more attributedString properties
}

Ziel c

Ich habe gerade die Anforderung erfüllt, dasselbe in einem reinen Objective-C-Projekt zu tun, also hier die Objective-C-Kategorie.

@interface NSMutableAttributedString (SetAsLinkSupport)

- (BOOL)setAsLink:(NSString*)textToFind linkURL:(NSString*)linkURL;

@end


@implementation NSMutableAttributedString (SetAsLinkSupport)

- (BOOL)setAsLink:(NSString*)textToFind linkURL:(NSString*)linkURL {

     NSRange foundRange = [self.mutableString rangeOfString:textToFind];
     if (foundRange.location != NSNotFound) {
         [self addAttribute:NSLinkAttributeName value:linkURL range:foundRange];
         return YES;
     }
     return NO;
}

@end

Verwendungsbeispiel:

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:"I love stackoverflow!"];

BOOL linkWasSet = [attributedString setAsLink:@"stackoverflow" linkURL:@"http://stackoverflow.com"];

if (linkWasSet) {
    // adjust more attributedString properties
}

Stellen Sie sicher, dass das Verhaltensattribut des NSTextFields als Selectable . festgelegt ist. Xcode NSTextField behavior attribute

108
Karl Nosworthy

Ich habe gerade eine Unterklasse von UILabel erstellt, die speziell auf solche Anwendungsfälle eingeht. Sie können mühelos mehrere Links hinzufügen und unterschiedliche Handler für sie definieren. Es unterstützt auch das Hervorheben des gedrückten Links, wenn Sie auf das Touch-Touch-Touchdown zugreifen. Siehe https://github.com/null09264/FRHyperLabel .

In Ihrem Fall könnte der Code folgendermaßen aussehen: 

FRHyperLabel *label = [FRHyperLabel new];

NSString *string = @"This morph was generated with Face Dancer, Click to view in the app store.";
NSDictionary *attributes = @{NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]};

label.attributedText = [[NSAttributedString alloc]initWithString:string attributes:attributes];

[label setLinkForSubstring:@"Face Dancer" withLinkHandler:^(FRHyperLabel *label, NSString *substring){
    [[UIApplication sharedApplication] openURL:aURL];
}];

Sample Screenshot (In diesem Fall wird der Handler so eingestellt, dass eine Warnung statt einer URL geöffnet wird.)

facedancer

30
Jinghan Wang

Kleine Verbesserung der Lösung von ujell: Wenn Sie NSURL anstelle eines NSStrings verwenden, können Sie eine beliebige URL verwenden (z. B. benutzerdefinierte URLs).

NSURL *URL = [NSURL URLWithString: @"whatsapp://app"];
NSMutableAttributedString * str = [[NSMutableAttributedString alloc] initWithString:@"start Whatsapp"];
[str addAttribute: NSLinkAttributeName value:URL range: NSMakeRange(0, str.length)];
yourTextField.attributedText = str;

Habe Spaß!

26
Hans One

Ich hatte auch eine ähnliche Anforderung, zuerst verwendete ich UILabel und dann wurde mir klar, dass UITextView besser ist. Ich habe UITextView dazu gebracht, sich wie UILabel zu verhalten, indem ich die Interaktion und den Bildlauf deaktiviert habe, und eine Kategoriemethode für NSMutableAttributedString erstellt, um den Link auf den Text genau so einzustellen, wie Karl es getan hat (+1 für das). Dies ist meine Zielversion

-(void)setTextAsLink:(NSString*) textToFind withLinkURL:(NSString*) url
{
    NSRange range = [self.mutableString rangeOfString:textToFind options:NSCaseInsensitiveSearch];

    if (range.location != NSNotFound) {

        [self addAttribute:NSLinkAttributeName value:url range:range];
        [self addAttribute:NSForegroundColorAttributeName value:[UIColor URLColor] range:range];
    }
}

sie können dann den untenstehenden Delegaten verwenden, um die Aktion auszuführen

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)url inRange:(NSRange)characterRange
{
    // do the task
    return YES;
}
18
anoop4real

Verwenden Sie UITextView, das anklickbare Links unterstützt. Erstellen Sie mit dem folgenden Code eine attributierte Zeichenfolge

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:strSomeTextWithLinks];

Stellen Sie dann den Text für UITextView wie folgt ein

NSDictionary *linkAttributes = @{NSForegroundColorAttributeName: [UIColor redColor],

                                 NSUnderlineColorAttributeName: [UIColor blueColor],

                                 NSUnderlineStyleAttributeName: @(NSUnderlinePatternSolid)};

customTextView.linkTextAttributes = linkAttributes; // customizes the appearance of links
textView.attributedText = attributedString;

Stellen Sie sicher, dass Sie das "Selectable" -Verhalten von UITextView in XIB aktivieren.

15
Nitheesh George

Schnell 4:

var string = "Google"
var attributedString = NSMutableAttributedString(string: string, attributes:[NSAttributedStringKey.link: URL(string: "http://www.google.com")!])

yourTextView.attributedText = attributedString

Swift 3.1:

var string = "Google"
var attributedString = NSMutableAttributedString(string: string, attributes:[NSLinkAttributeName: URL(string: "http://www.google.com")!])

yourTextView.attributedText = attributedString
12
Bill Chan

Swift 3-Beispiel zum Erkennen von Aktionen für zugewiesene Textanschläge 

https://stackoverflow.com/a/44226491/5516830

let termsAndConditionsURL = TERMS_CONDITIONS_URL;
let privacyURL            = PRIVACY_URL;

override func viewDidLoad() {
    super.viewDidLoad()

    self.txtView.delegate = self
    let str = "By continuing, you accept the Terms of use and Privacy policy"
    let attributedString = NSMutableAttributedString(string: str)
    var foundRange = attributedString.mutableString.range(of: "Terms of use") //mention the parts of the attributed text you want to tap and get an custom action
    attributedString.addAttribute(NSLinkAttributeName, value: termsAndConditionsURL, range: foundRange)
    foundRange = attributedString.mutableString.range(of: "Privacy policy")
    attributedString.addAttribute(NSLinkAttributeName, value: privacyURL, range: foundRange)
    txtView.attributedText = attributedString
}

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewController(withIdentifier: "WebView") as! SKWebViewController

    if (URL.absoluteString == termsAndConditionsURL) {
        vc.strWebURL = TERMS_CONDITIONS_URL
        self.navigationController?.pushViewController(vc, animated: true)
    } else if (URL.absoluteString == privacyURL) {
        vc.strWebURL = PRIVACY_URL
        self.navigationController?.pushViewController(vc, animated: true)
    }
    return false
}

Wie gewünscht können Sie mit der shouldInteractWith URLUITextFieldDelegate-Methode jede gewünschte Aktion hinzufügen.

Prost!!

9
Akila Wasala

Ich habe eine Methode geschrieben, die einem String (fullString) einen Link (linkString) mit einer bestimmten URL (urlString) hinzufügt: 

- (NSAttributedString *)linkedStringFromFullString:(NSString *)fullString withLinkString:(NSString *)linkString andUrlString:(NSString *)urlString
{
    NSRange range = [fullString rangeOfString:linkString options:NSLiteralSearch];
    NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:fullString];

    NSMutableParagraphStyle *paragraphStyle = NSMutableParagraphStyle.new;
    paragraphStyle.alignment = NSTextAlignmentCenter;
    NSDictionary *attributes = @{NSForegroundColorAttributeName:RGB(0x999999),
                                 NSFontAttributeName:[UIFont fontWithName:@"HelveticaNeue-Light" size:10],
                                 NSParagraphStyleAttributeName:paragraphStyle};
    [str addAttributes:attributes range:NSMakeRange(0, [str length])];
    [str addAttribute: NSLinkAttributeName value:urlString range:range];

    return str;
}

Du solltest es so nennen: 

NSString *fullString = @"A man who bought the Google.com domain name for $12 and owned it for about a minute has been rewarded by Google for uncovering the flaw.";
NSString *linkString = @"Google.com";
NSString *urlString = @"http://www.google.com";

_youTextView.attributedText = [self linkedStringFromFullString:fullString withLinkString:linkString andUrlString:urlString];
4
wzbozon

Schnelle Version:

    // Attributed String for Label
    let plainText = "Apkia"
    let styledText = NSMutableAttributedString(string: plainText)
    // Set Attribuets for Color, HyperLink and Font Size
    let attributes = [NSFontAttributeName: UIFont.systemFontOfSize(14.0), NSLinkAttributeName:NSURL(string: "http://apkia.com/")!, NSForegroundColorAttributeName: UIColor.blueColor()]
    styledText.setAttributes(attributes, range: NSMakeRange(0, plainText.characters.count))
    registerLabel.attributedText = styledText
3
ioopl

Aktualisieren:

Meine Frage bestand aus zwei Hauptteilen:

  1. So erstellen Sie einen Link, bei dem der angezeigte Text für den anklickbaren Link von dem tatsächlich aufgerufenen Link abweicht:
  2. So richten Sie die Links ein, ohne dass Sie benutzerdefinierten Code verwenden müssen, um die Attribute für den Text festzulegen.

Es stellt sich heraus, dass iOS 7 die Fähigkeit hinzugefügt hat, Attributtext von NSData zu laden.

Ich habe eine benutzerdefinierte Unterklasse von UITextView erstellt, die das @IBInspectable-Attribut nutzt und das Laden von Inhalten aus einer RTF Datei direkt in IB ermöglicht. Sie geben einfach den Dateinamen in IB ein und die benutzerdefinierte Klasse erledigt den Rest.

Hier sind die Details:

In iOS 7 gewann NSAttributedString die Methode initWithData:options:documentAttributes:error:. Mit dieser Methode können Sie einen NSAttributedString aus einem NSData-Objekt laden. Sie können zuerst eine RTF Datei in NSData laden und dann mit initWithData:options:documentAttributes:error: diese NSData in Ihre Textansicht laden. (Beachten Sie, dass es auch eine Methode initWithFileURL:options:documentAttributes:error: gibt, mit der eine attributierte Zeichenfolge direkt aus einer Datei geladen wird. Diese Methode wurde in iOS 9 jedoch als veraltet eingestuft. Es ist sicherer, die Methode initWithData:options:documentAttributes:error: zu verwenden, die nicht veraltet ist.

Ich wollte eine Methode, mit der ich anklickbare Links in meinen Textansichten installieren kann, ohne Code erstellen zu müssen, der für die von mir verwendeten Links spezifisch ist.

Die Lösung, mit der ich mich beschäftigte, bestand darin, eine benutzerdefinierte Unterklasse von UITextView zu erstellen, die ich RTF_UITextView nenne, und ihr eine @IBInspectable-Eigenschaft namens RTF_Filename zu geben. Durch das Hinzufügen des @IBInspectable-Attributs zu einer Eigenschaft wird der Schnittstellen-Generator diese Eigenschaft im "Attribute-Inspektor" verfügbar machen. Sie können diesen Wert dann von IB ohne benutzerdefinierten Code festlegen.

Ich habe auch ein @IBDesignable-Attribut zu meiner benutzerdefinierten Klasse hinzugefügt. Das @IBDesignable-Attribut teilt Xcode mit, dass eine laufende Kopie Ihrer benutzerdefinierten Ansichtsklasse im Interface-Builder installiert werden sollte, damit Sie sie in der grafischen Anzeige Ihrer Ansichtshierarchie sehen können. () Für diese Klasse scheint die @IBDesignable-Eigenschaft unübersichtlich zu sein. Es hat funktioniert, als ich es zum ersten Mal hinzugefügt habe, aber dann habe ich den Klartextinhalt meiner Textansicht gelöscht, und die anklickbaren Links in meiner Ansicht sind verschwunden, und ich konnte sie nicht zurückholen.)

Der Code für meinen RTF_UITextView ist sehr einfach. Zusätzlich zum Hinzufügen des @IBDesignable-Attributs und einer RTF_Filename-Eigenschaft mit dem @IBInspectable-Attribut habe ich der RTF_Filename-Eigenschaft eine didSet()-Methode hinzugefügt. Die didSet()-Methode wird jedes Mal aufgerufen, wenn sich der Wert der RTF_Filename-Eigenschaft ändert. Der Code für die didSet()-Methode ist recht einfach:

@IBDesignable
class RTF_UITextView: UITextView
{
  @IBInspectable
  var RTF_Filename: String?
    {
    didSet(newValue)
    {
      //If the RTF_Filename is nil or the empty string, don't do anything
      if ((RTF_Filename ?? "").isEmpty)
      {
        return
      }
      //Use optional binding to try to get an URL to the
      //specified filename in the app bundle. If that succeeds, try to load
      //NSData from the file.
      if let fileURL = NSBundle.mainBundle().URLForResource(RTF_Filename, withExtension: "rtf"),

        //If the fileURL loads, also try to load NSData from the URL.
        let theData = NSData(contentsOfURL: fileURL)
      {
        var aString:NSAttributedString
        do
        {
          //Try to load an NSAttributedString from the data
          try
            aString = NSAttributedString(data: theData,
              options: [:],
              documentAttributes:  nil
          )
          //If it succeeds, install the attributed string into the field.
          self.attributedText = aString;
        }
        catch
        {
          print("Nerp.");
        }
      }

    }
  }
}

Wenn Sie mit der @IBDesignable-Eigenschaft nicht zuverlässig eine Vorschau des stilisierten Textes im Interface-Builder anzeigen können, empfiehlt es sich, den obigen Code als Erweiterung von UITextView und nicht als benutzerdefinierte Unterklasse einzurichten. Auf diese Weise können Sie es in jeder Textansicht verwenden, ohne die Textansicht in die benutzerdefinierte Klasse ändern zu müssen.

Sehen Sie sich meine andere Antwort an, wenn Sie iOS-Versionen vor iOS 7 unterstützen müssen.

Sie können ein Beispielprojekt mit dieser neuen Klasse von gitHub herunterladen:

DatesInSwift-Demo-Projekt auf Github

3
Duncan C

Suchen Sie einfach eine codefreie Lösung für UITextView:  enter image description here

Aktivieren Sie die Optionen Erkennung -> Links, die URL und auch die E-Mail werden erkannt und können angeklickt werden!

3
Bill Chan

Ich musste weiterhin ein reines UILabel verwenden, das so genannte von meinem Tipperkenner (dies basiert auf der Antwort von malex hier: Zeichenindex am Berührungspunkt für UILabel )

UILabel* label = (UILabel*)gesture.view;
CGPoint tapLocation = [gesture locationInView:label];

// create attributed string with paragraph style from label

NSMutableAttributedString* attr = [label.attributedText mutableCopy];
NSMutableParagraphStyle* paragraphStyle = [NSMutableParagraphStyle new];
paragraphStyle.alignment = label.textAlignment;

[attr addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, label.attributedText.length)];

// init text storage

NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:attr];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
[textStorage addLayoutManager:layoutManager];

// init text container

NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(label.frame.size.width, label.frame.size.height+100) ];
textContainer.lineFragmentPadding  = 0;
textContainer.maximumNumberOfLines = label.numberOfLines;
textContainer.lineBreakMode        = label.lineBreakMode;

[layoutManager addTextContainer:textContainer];

// find tapped character

NSUInteger characterIndex = [layoutManager characterIndexForPoint:tapLocation
                                                  inTextContainer:textContainer
                         fractionOfDistanceBetweenInsertionPoints:NULL];

// process link at tapped character

[attr enumerateAttributesInRange:NSMakeRange(characterIndex, 1)
                                         options:0
                                      usingBlock:^(NSDictionary<NSString *,id> * _Nonnull attrs, NSRange range, BOOL * _Nonnull stop) {
                                          if (attrs[NSLinkAttributeName]) {
                                              NSString* urlString = attrs[NSLinkAttributeName];
                                              NSURL* url = [NSURL URLWithString:urlString];
                                              [[UIApplication sharedApplication] openURL:url];
                                          }
                                      }];
3
masty

Eine schnelle Ergänzung zu Duncan Cs Originalbeschreibung gegenüber dem IB-Verhalten. Er schreibt: "Es ist trivial, Hyperlinks in einer UITextView anklickbar zu machen. Sie setzen einfach das Kontrollkästchen" Links erkennen "in der Ansicht in IB, und es werden HTTP-Links erkannt und in Hyperlinks umgewandelt."

Meine Erfahrung (zumindest in xcode 7) besteht darin, dass Sie auch das Verhalten "Editable" deaktivieren müssen, damit die URLs erkannt und angeklickt werden können.

2
sakumatto

Verwenden Sie UITextView und legen Sie dataDetectorTypes für Link fest.

so was:

testTextView.editable = false 
testTextView.dataDetectorTypes = .link

Wenn Sie den Link, die Telefonnummer, die Adresse usw. ermitteln möchten

testTextView.dataDetectorTypes = .all
2
Adarsh G J

Wenn Sie den NSLinkAttributeName in einer UITextView verwenden möchten, sollten Sie die AttributedTextView-Bibliothek verwenden. Es ist eine UITextView-Unterklasse, die den Umgang mit diesen sehr einfach macht. Weitere Informationen finden Sie unter: https://github.com/evermeer/AttributedTextView

Sie können jeden Teil des Textes wie folgt interagieren lassen (wobei textView1 ein UITextView-IBoutlet ist):

textView1.attributer =
    "1. ".red
    .append("This is the first test. ").green
    .append("Click on ").black
    .append("evict.nl").makeInteract { _ in
        UIApplication.shared.open(URL(string: "http://evict.nl")!, options: [:], completionHandler: { completed in })
    }.underline
    .append(" for testing links. ").black
    .append("Next test").underline.makeInteract { _ in
        print("NEXT")
    }
    .all.font(UIFont(name: "SourceSansPro-Regular", size: 16))
    .setLinkColor(UIColor.purple) 

Und für die Handhabung von Hashtags und Erwähnungen können Sie Code wie folgt verwenden:

textView1.attributer = "@test: What #hashtags do we have in @evermeer #AtributedTextView library"
    .matchHashtags.underline
    .matchMentions
    .makeInteract { link in
        UIApplication.shared.open(URL(string: "https://Twitter.com\(link.replacingOccurrences(of: "@", with: ""))")!, options: [:], completionHandler: { completed in })
    }
1
Edwin Vermeer

Die schnelle Antwort ist UITextView anstelle von UILabel. Sie müssen Selectable aktivieren und Editable deaktivieren.

Deaktivieren Sie dann die Scroll-Anzeigen und -Prüfungen.

Screen Shot

Screen Shot

Meine Lösung mit NSMutableAttributedString aus der HTML-Zeichenfolge NSHTMLTextDocumentType

NSString *s = @"<p><a href='https://iTunes.Apple.com/us/app/xxxx/xxxx?mt=8'>https://iTunes.Apple.com/us/app/xxxx/xxxx?mt=8</a></p>";

NSMutableAttributedString *text = [[NSMutableAttributedString alloc]
                                           initWithData: [s dataUsingEncoding:NSUnicodeStringEncoding]
                                           options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType }
                                           documentAttributes: nil
                                           error: nil
                                           ];

cell.content.attributedText = text;

Die hervorragende Bibliothek aus @AliSoftwareOHAttributedStringAdditions macht das Hinzufügen von Links in UILabel einfach. Hier ist die Dokumentation: https://github.com/AliSoftware/OHAttributedStringAdditions/wiki/link) -in-UILabel

0
iGranDav
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:strSomeTextWithLinks];

NSDictionary *linkAttributes = @{NSForegroundColorAttributeName: [UIColor redColor],   
                                 NSUnderlineColorAttributeName: [UIColor blueColor],
                                 NSUnderlineStyleAttributeName: @(NSUnderlinePatternSolid)};

customTextView.linkTextAttributes = linkAttributes; // customizes the appearance of links
textView.attributedText = attributedString;

WICHTIGE PUNKTE:

  • Stellen Sie sicher, dass Sie das "Selectable" -Verhalten von UITextView in XIB aktivieren.
  • Stellen Sie sicher, dass Sie das "Editable" Verhalten der UITextView in XIB deaktivieren.
0
Shashank Sharma

Falls Sie Probleme haben, was @Karl Nosworthy und @esilver oben bereitgestellt haben, habe ich die NSMutableAttributedString-Erweiterung auf ihre Swift 4-Version aktualisiert.

extension NSMutableAttributedString {

public func setAsLink(textToFind:String, linkURL:String) -> Bool {

    let foundRange = self.mutableString.range(of: textToFind)
    if foundRange.location != NSNotFound {
         _ = NSMutableAttributedString(string: textToFind)
        // Set Attribuets for Color, HyperLink and Font Size
        let attributes = [NSFontAttributeName: UIFont.bodyFont(.regular, shouldResize: true), NSLinkAttributeName:NSURL(string: linkURL)!, NSForegroundColorAttributeName: UIColor.blue]

        self.setAttributes(attributes, range: foundRange)
        return true
    }
    return false
  }
}
0
Vick Swift

wenn Sie in Ihrem UITextView einen aktiven Teilstring wünschen, können Sie mein erweitertes TextView verwenden ... es ist kurz und einfach. Sie können es nach Belieben bearbeiten.

ergebnis:  enter image description here

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

0
Marek Manduch