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.
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 NSAttributedString
does 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
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.
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.
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.)
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ß!
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;
}
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.
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
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 URL
UITextFieldDelegate-Methode jede gewünschte Aktion hinzufügen.
Prost!!
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];
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
Meine Frage bestand aus zwei Hauptteilen:
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
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];
}
}];
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.
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
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 })
}
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.
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
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;
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
}
}
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.