2016-11-21 1 views
8

ein Beispiel herunterladen I erstellt habenSwift - NSMutableAttributedString ändert sich der Text in UITextView

Example Link

ich einen Link zu meiner UITextView wie dies am Zusatz:

 let systemFont = self.text.font! 
       let linkAttributes = [ 
        NSFontAttributeName : systemFont, 
        NSLinkAttributeName: NSURL(string: alertController.textFields![0].text!)!] as [String : Any] 

       let myAttributes2 = [ NSForegroundColorAttributeName: customGreen] 

       let attributedString = NSMutableAttributedString(string: "\(urlName)") 

       // Set the 'click here' substring to be the link 
       attributedString.setAttributes(linkAttributes, range: NSMakeRange(0, urlName.characters.count))//(0, urlName.characters.count)) 

       self.text.linkTextAttributes = myAttributes2 
       self.text.textStorage.insert(attributedString, at: self.text.selectedRange.location) 

       let cursor = NSRange(location: self.text.selectedRange.location + "\(urlName)".characters.count, length: 0) 
       self.text.selectedRange = cursor 
       // self.text.font = systemFont 

Aber nach dem Einlegen ändert sich der gesamte aktuelle Text in UITextView in die gleiche Schriftart.

Also zum Beispiel, wenn ich Text habe, der fett ist und mehr Text, der kursiv ist, nachdem ich die URL (die Systemschriftart) hinzugefügt hat, setzt er den ganzen fett/kursiven Text auf die Systemschriftart zurück ....

Wenn jemand weiß, wie man die aktuelle Schriftart des vorherigen Textes behält, würde ich die Hilfe wirklich schätzen.

Für weitere Erklärungen einfach einen Kommentar hinterlassen!

Vielen Dank im Voraus an alle, die helfen können!

aktualisieren

ich den Text hier in textDidChange am Wechsel

if text == " " { 
       //  let systemFont = self.text.font! 
       // let linkAttributes = [NSFontAttributeName : systemFont] 
        let attributes = [NSForegroundColorAttributeName: UIColor.black, NSFontAttributeName: self.text.font!] as [String : Any] 

        let attributedString = NSMutableAttributedString(string: text, attributes: attributes) 
        self.text.textStorage.insert(attributedString, at: range.location) 
        let cursor = NSRange(location: self.text.selectedRange.location+1, length: 0) 
        textView.selectedRange = cursor 
       return false 
      } 

Ich habe das so nach dem Hinzufügen der URL ich einen Raum zu machen und setzen Sie die Schrift so kann ich weiterhin nicht Typisierung als eine URL-Verbindung ... Wahrscheinlich das Problem, aber wenn ich normal schreibe und eine URL-Verknüpfung nicht den Text nicht ändert, während ein Leerzeichen machen ...

+1

Ihr Code scheint in Ordnung zu sein, können Sie bitte mehr ausarbeiten? –

+0

@ J.Koush Nun, das ist, was ich auch dachte. Im Grunde genommen ist das meine UITextView: ** Dies ist ein fettgedruckter Text ** und __Dies ist ein kursiver Text__ (Soviel zu unterschiedliche Arten von Fonts) www.Google.com (dies ist System Font Text.Nach dem Hinzufügen dieses Links wird der vorherige fett gedruckte Text und der kursive Text als || Systemschriftart (normaler Text wie hier) || festgelegt und natürlich möchte ich den vorherigen fett- und kursiven Text beibehalten und möchte nur, dass der Link Systemschriftart ist. nicht sicher, ob das noch hilft ... Ich werde versuchen, ein Beispiel zu bekommen, das später gemacht wird, wenn du es nicht verstehst? –

+0

hast du die letzte Zeile '// self.text.font = systemFont' auskommentiert, da es in meiner App funktioniert, vergewissere dich, dass du die Schriftart auf dem UITextView nicht woanders änderst. –

Antwort

4
let urlName = "google" 

@IBAction func btnPressed(_ sender: Any) { 

    let systemFont = UIFont.systemFont(ofSize: 11) 
    let linkAttributes = [ 
     NSFontAttributeName : systemFont, 
     NSLinkAttributeName: NSURL(string: "https://www.google.com")!] as [String : Any] 

    let myAttributes2 = [NSForegroundColorAttributeName: UIColor.green] 

    let attributedString = NSMutableAttributedString(string: "\(urlName)") 

    attributedString.setAttributes(linkAttributes, range: NSMakeRange(0, urlName.characters.count))//(0, urlName.characters.count)) 

    self.text.linkTextAttributes = myAttributes2 
    self.text.textStorage.insert(attributedString, at: self.text.selectedRange.location) 

    let cursor = NSRange(location: self.text.selectedRange.location + "\(urlName)".characters.count, length: 0) 
    self.text.selectedRange = cursor 
} 

So sollten Sie textView aktualisieren, wenn Sie Text programmgesteuert hinzufügen möchten. Verwenden Sie in dieser Situation nicht die textViewDidChange (_ :) -Delegatenmethode.

UPDATE

Ich habe den Code von Dropbox heruntergeladen und auf es einige Änderungen. also hier ändere ich den textView Text in viewDidLoad() zum Beispiel. Ich habe zwei Konstanten erstellt, um sie wieder im Code zu verwenden, fontAttr ist die ursprüngliche Schriftart mit dem Namen und der Größe und fontColorAttrBlue ist die ursprüngliche Schriftfarbe.

let fontAttr = UIFont(name: "Helvetica-Bold", size: 20) 
let fontColorAttrBlue = UIColor.blue 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let attrString = NSMutableAttributedString(string: "Hello World, How are you?", attributes: [NSFontAttributeName : fontAttr!, NSForegroundColorAttributeName: fontColorAttrBlue ]) 
    self.textView.delegate = self // you can set the delegate from the storyboard. 
    self.textView.attributedText = attrString 
} 

Und ich habe diese Codezeile gelöscht self.textView.font = systemFont von webLink(_ sender: AnyObject) Aktion-Methode, so dass es nicht die Schriftart des Textview ändern würde.

Und schließlich in textView(_:shouldChangeTextIn:replacementText:) Methode, anstatt zu überprüfen, ob der Benutzer " " String Ich überprüfe, ob der Benutzer einen String eingegeben hat und die Schriftart-Attribute, die ich am Anfang erstellt, wieder verwendet, so dass der Benutzer jede Art eingibt Nach dem Link wäre es der Originaltext und nicht der für den gleichen Text.

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { 
    if text.characters.count > 0 { 
     let attributedString = NSMutableAttributedString(string: text, attributes: [NSFontAttributeName : self.fontAttr!, NSForegroundColorAttributeName: self.fontColorAttrBlue]) 
     self.textView.textStorage.insert(attributedString, at: range.location) 
     let cursor = NSRange(location: self.textView.selectedRange.location+1, length: 0) 
     textView.selectedRange = cursor 
     return false 
    } 
    return true 
} 
+0

Ich bin mir ziemlich sicher das ist mein Text, und ich füge es nicht hinzu, wenn ich meine App starte. Ich füge den Link hinzu, wenn ich einen Knopf drücke. –

+0

Was war der Punkt in dieser Bearbeitung? –

+0

@Jack Ich habe einen konstanten URL-Namen erstellt und den Code in eine IBAction eingefügt, so dass ein Benutzer eine Schaltfläche drückt, die aufgerufen wird, und der konstante URL-Name wird am Ende des UITextView-Texts hinzugefügt. –

Verwandte Themen