2016-04-30 8 views
0

Ich mache eine UITableViewCell für einige Aktivitäten Feed-Objekte, um Ihnen eine Idee zu geben, dass sie wie die Facebook-Beiträge sein werden, wo Sie mehrere Links in einem Beitrag haben.Mehrere Zeilen UILabel mit mehreren Tasten und Schriftarten

In meinem Fall gibt es werde für jede Stelle und eine Ebene UILabel anderen UIViewController zwei Links sein, dass die beiden und erklärt die Verbindung (wie "X hat kommentiert Y‚s Post verbindet ") wo Sie sowohl X als auch Y für einige Aktionen tippen könnten.

Wie gerade jetzt, habe ich gerade 3 separate UILabel s gemacht. Das Problem dabei ist, dass ich nicht sicher bin, wie man mit Namen umgehen soll, die in mehreren Zeilen zu lang sind.

Bedeutung, wenn beispielsweise anstelle von X, die Post ist "XXXXXXXXXXXXXXXXX auf Y kommentiert hat 's Post", dann "auf Y kommentiert hat den Beitrag von" würde gehen müssen in einer anderen Zeile.

Wie ich jetzt gerade die 3 UILabel s mit Einschränkungen verbinden, so dass sie nebeneinander sind, aber das würde nicht funktionieren, wenn sie zu lang sind.

Wenn Sie eine Idee haben, wie ich dieses Problem angehen könnte, wäre es sehr dankbar, wenn Sie mich wissen lassen könnten.

Vielen Dank im Voraus.

+0

helfen Was Sie genau wollen? Wollen Sie ein mehrzeiliges Etikett? – Lion

+0

Ich möchte ein Etikett, das möglicherweise mehrzeilig wird, wenn der Text zu lang ist. Gleichzeitig besteht das Label aus 3 Objekten mit 2 verschiedenen Schriftarten. Zwei der Objekte (2 Wörter) müssen ebenfalls mit bestimmten Aktionen verknüpft werden, während die dritte nur eine einfache Zeichenfolge ist. –

+0

Überprüfen Sie meine Antwort, wenn es hilft :) – Lion

Antwort

1

Es gibt zu viele Etiketten, ich glaube, Sie diese Erweiterung verwenden können:

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 
    } 
} 

Dann können Sie tun:

let labelFont = UIFont(name: "HelveticaNeue-Bold", size: 18) 
let attributes :[String:AnyObject] = [NSFontAttributeName : labelFont!] 
let attrString = NSAttributedString(string:"foo www.google.com", attributes: attributes) 
let urlPath: String = "http://www.google.com" 
let url: NSURL = NSURL(string: urlPath)! 
attrString.setAsLink("www.google.com", linkURL:url) 
myLabel.attributedText = attrString 

UPDATE: (nach Ihrer Kommentare)

Wenn Sie den URLlink abfangen müssen, können Sie das Label in textView (UITextView) umwandeln, es als Delegat festlegen und die Methode shouldInteractWithURL behandeln:

class ViewController: UIViewController, UITextViewDelegate { 
... // on your code do: 
    myTextView.delegate = self 
... 
func textView(textView: UITextView!, shouldInteractWithURL URL: NSURL!, inRange characterRange: NSRange) -> Bool { 

    if URL.scheme == "http://www.google.com" { 
     //do whatever you want 
     launchMyMethodForThisUrl() 
    } 

} 
+0

Danke für die Antwort. Für Link meinte ich nur eine Verknüpfung zu einer Aktion oder Methode wie 'showFirstObject()'. Entschuldigung für die Verwirrung. Könnte ich Ihre Implementierung immer noch verwenden, denken Sie? Kann ich eine Tapp-Aktion nur für einen Teiltext eines 'UILabel' hinzufügen? –

+0

Grazie Mille! Wie ich jedoch auf der anderen Antwort sagte, interagiere ich überhaupt nicht mit URLs. Ich brauche nur ein Label wie "A something B", wo ich auf A tippen könnte und ein detaillierter ViewController für A würde angezeigt werden, tippen Sie auf B und Anthere ViewController für das B-Objekt würde präsentiert werden. Also muss ich im Grunde nur zwei verschiedene Antippaktionen zu Teilen des UILabel-Textes hinzufügen. Ich muss auch "tappable" Wörter fett machen, um zu zeigen, dass Sie auf sie tippen können. Ist das sinnvoll? –

+0

Erinnern Sie sich daran, dass Sie UITapGestureRecognizer verwenden können, um ein Etikett zu tappen, ehrlich gesagt, es ist keine gute Einstellung, wenn Sie den genauen Inhalt dieses Etiketts nicht kennen. Wenn Sie nur einen Teil Ihrer Inhalte "anklickbar" machen wollen, brauchen Sie nur die Hyperlinks, die nur in attributierten Strings verfügbar sind. Wählen Sie Ihr Schicksal, ich denke in diesem Fall ist die bessere Lösung UITextView. "Figurati nicht c'e 'di che" –

0

Set Anzahl der Linie des Labels zu zero wie

label.numberOfLines = 0  // it will increase line when needed 

Und Verwendung Attribut Zeichenfolge für verschiedene Schriftarten und Größe oder Links usw.

und legen Sie dann die Zeichenfolge als beschriften ,

label.attributedText = attributedString 

Update:

Wenn Sie ein Aktionsereignis für einen bestimmten Text wünschen, sollten Sie UITextview anstelle von Label verwenden. es wird einfacher durch die Implementierung shouldInteractWithURL Delegierten davon.

Eine andere gute Lösung ist die Third Party Bibliothek wie TTTAttributedLabel. Es ist genau was du willst, denke ich. einmal gucken.

Update 2:

siehe this link oder this link für die gewünschte Ausgabe

Hope this wird :)

+0

Danke für die Antwort! Ich denke, ich verwende den Begriff "Link" falsch. Ich wollte den ViewController mit einem anderen ViewController verbinden! In dem Beispiel, das ich in meiner Frage gemacht habe, wäre eine Zeichenfolge wie "A something B" - A und B wären zum Beispiel eine fette Schrift und tippen auf A würde einen ViewController für das Objekt A darstellen und B für das Objekt B antippen . Ist das sinnvoll? Sollte ich TextView noch verwenden oder war das einfach besser für URLs? –

+2

Jungs bleiben weg von TTTAttributedLabel, es stürzt im sozialen Netzwerk wie Projekte mit speziellen Zeichen, gibt es mehr als 60 offene Frage .. –

+0

@GiulioCollefluor, Überprüfen Sie mein Update in Antwort ich habe zwei Link geteilt. hoffe, es wird helfen :) – Lion