2017-07-11 3 views
0

Ich frage mich, ob es möglich ist, eine UITapGestureRecognizer zu einem NSMutableAttributedString hinzuzufügen.iOS/Swift: Hinzufügen UITapGestureRecognizer zu NSMutableAttributedString

Was ich suche, ist ein "mehr ..." Objekt nach dem letzten Wort eines Zeichen-begrenzten UITextView. Damit das Objekt sofort nach dem letzten Wort angezeigt wird, scheint es am besten zu sein, dass der UITextView attributierten Text (anstelle von Nur-Text) akzeptiert und dann ein blaues "mehr ..." vom Typ NSMutableAttributedString anfügt.

Ich habe Beispiele von Leuten gesehen, die dies erreichen, indem sie die Tapp-Geste zu der umschließenden UITextView hinzufügen, aber das ist nicht ausreichend, da ich möchte, dass eine Aktion nur auftritt, wenn sie am Ende auf "mehr ..." tippen die attributierte Zeichenfolge in der Textansicht. Ich würde gerne sehen, ob es eine Möglichkeit gibt, eine Tap-Geste direkt zu der attributierten Zeichenfolge hinzuzufügen.

Antwort

3

Zunächst einmal gibt es keine Möglichkeit, einen Gestenerkenner zu einer NSMutableAttributedString hinzuzufügen, nur weil der Attributstring nichts über seine Position auf dem Bildschirm weiß. Der Prozess, der eine attributierte Zeichenkette hat, um sie auf eine UITextView zu zeichnen, wird hauptsächlich von den drei Klassen , NSTextContainer und NSLayoutManager gesteuert. Wenn Sie ein bisschen mehr darüber wissen möchten, wie sie funktionieren, sehen Sie sich this awesome tutorial an.

Jetzt sollten Sie wissen, dass Sie keine Tapp-Gestenerkenner zu einer attributierten Zeichenfolge hinzufügen müssen, um zu erreichen, was Sie wollen. Wenn Sie die UITextView nicht benötigen, um bearbeitbar zu sein, dann wäre es eine einfachere Option, diese blaue More... als Link auszuprobieren und eine benutzerdefinierte Aktion anzuhängen, wenn der Benutzer sie berührt. Unten ist eine schnelle Übersetzung des Ziel-c-Codes in this link für ein kleines Beispiel, wie man das macht.

class ViewController: UIViewController, UITextViewDelegate { 
    @IBOutlet weak var textView: UITextView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let str = NSMutableAttributedString(string: "This is a sample text that is very long but you can see it completely because more...") 
     str.addAttribute(
     NSLinkAttributeName, 
     value: "more://", 
     range: (str.string as NSString).range(of: "more...")) 

     textView.attributedText = str 
     textView.delegate = self 
     textView.isSelectable = true 
     textView.isEditable = false 
    } 

    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { 
     if URL.scheme == "more" { 
     print("More option pressed") 
     return false 
     } 
     else { 
     return true 
     } 
    } 
} 
Verwandte Themen