Swift : Tippen Sie auf einen Teil des Textes von UILabel
Ich habe ein problem, dass "boundingRectForGlyphRange" immer wieder CGRect.null "0.0, 0.0, 0.0, 0.0". "boundingRectForGlyphRange" nicht funktioniert. So bin ich zum Beispiel der Codierung für berühren auf einen Teil des Textes der UILabel-Funktion. Mein text hat erste Teil ist "beliebiger text" und das zweite ist "LESEN Sie MEHR". Ich will die tap-Erkennung nur funktioniert, wenn ich berühren Sie "MEHR LESEN". Wenn ich Tippen Sie auf einen beliebigen Punkt auf UILabel, "CGRectContainsPoint" immer "true" zurückgeben,dann wird die Aktion genannt
Hier mein code:
override func viewDidLoad() {
super.viewDidLoad()
//The full string
let firstPart:NSMutableAttributedString = NSMutableAttributedString(string: "Lorem ipsum dolor set amit ", attributes: [NSFontAttributeName: UIFont.systemFontOfSize(13)])
firstPart.addAttribute(NSForegroundColorAttributeName, value: UIColor.blackColor(),
range: NSRange(location: 0, length: firstPart.length))
info.appendAttributedString(firstPart)
//The "Read More" string that should be touchable
let secondPart:NSMutableAttributedString = NSMutableAttributedString(string: "READ MORE", attributes: [NSFontAttributeName: UIFont.systemFontOfSize(14)])
secondPart.addAttribute(NSForegroundColorAttributeName, value: UIColor.blackColor(),
range: NSRange(location: 0, length: secondPart.length))
info.appendAttributedString(secondPart)
lblTest.attributedText = info
//Store range of chars we want to detect touches for
moreStringRange = NSMakeRange(firstPart.length, secondPart.length)
print("moreStringRange\(moreStringRange)")
tapRec.addTarget(self, action: "didTap:")
lblTest.addGestureRecognizer(tapRec)
}
func didTap(sender:AnyObject) {
//Storage class stores the string, obviously
let textStorage:NSTextStorage = NSTextStorage(attributedString: info)
//The storage class owns a layout manager
let layoutManager:NSLayoutManager = NSLayoutManager()
textStorage.addLayoutManager(layoutManager)
//Layout manager owns a container which basically
//defines the bounds the text should be contained in
let textContainer:NSTextContainer = NSTextContainer(size: lblTest.frame.size)
textContainer.lineFragmentPadding = 0
textContainer.lineBreakMode = lblTest.lineBreakMode
//Begin computation of actual frame
//Glyph is the final display representation
var glyphRange = NSRange()
//Extract the glyph range
layoutManager.characterRangeForGlyphRange(moreStringRange!, actualGlyphRange: &glyphRange)
//Compute the rect of glyph in the text container
print("glyphRange\(glyphRange)")
print("textContainer\(textContainer)")
let glyphRect:CGRect = layoutManager.boundingRectForGlyphRange(glyphRange, inTextContainer: textContainer)
//Final rect relative to the textLabel.
print("\(glyphRect)")
//Now figure out if the touch point is inside our rect
let touchPoint:CGPoint = tapRec.locationOfTouch(0, inView: lblTest)
if CGRectContainsPoint(glyphRect, touchPoint) {
print("User tapped on Read More. So show something more")
}
}
Es ist nur eine demo um zu testen, was ich tun will:
Jegliche Hilfe würde sehr geschätzt werden.
Wie wäre es mit zwei Bezeichnungen?
Es ist nur eine demo. Mein text hat viele Teile mit Anhängen. Ich kann nicht viele Labels.
Wie gesagt, es ist nur eine demo, die "Lesen Sie mehr" (kann auch etwas anderes sein), kann nicht in das Ende der Zeichenkette.
Dann prüfen Sie eine stackoverflow.com/questions/32175144/...
InformationsquelleAutor Ashley | 2016-03-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nachdem ich mehrere Probleme mit dieser Art von Zeug, mit einer Menge von verschiedenen Bibliotheken, etc... ich fand eine interessante Lösung:
http://samwize.com/2016/03/04/how-to-create-multiple-tappable-links-in-a-uilabel/
Es zu verlängern UITapGestureRegonizer und erkennen, wenn der tap im Bereich der Zeichenfolge, wenn Sie ausgelöst werden.
Hier ist die aktualisierte Swift 4-version von dieser Erweiterung:
Vereinfachen Reihe Umwandlung, Sie brauchen auch in diesem Bereich Erweiterung
Sobald Sie diese Erweiterung können Sie fügen Sie eine tap-Geste, um Ihre label:
Hier ist die Funktion behandeln Sie das Leitungswasser:
Nicht für mich arbeiten
Es ist nicht in Ordnung.
dasselbe funktioniert nicht für mich auch. Ich denke, dass die Antwort nur eine Zeile label nicht für die multiline-label.
Für Multi-line-text, stellen Sie Ihr label Zeilenumbruch-Modus auf "Truncate tail".
InformationsquelleAutor Beninho85
Swift 3. Ich entwickelt haben, eine Erweiterung:
Und jetzt kann ich prüfen, ob die abgegriffenen Charakter in Reichweite ist:
let textContainer = NSTextContainer(size: CGSize(width: (self.label?.frame.width)!, height: (self.label.frame.height)+100))
aber keine chance.Guter Ansatz. Aber es handelt sich nicht um non-Links-ausgerichteten text (ex. Mitte oder rechts). Sieht aus wie es gibt keinen Weg, um pass alignment von
UILabel
zuNSTextContainer
dies funktioniert nicht für die multiline-label.
InformationsquelleAutor Naloiko Eugene
Dies ist eine wirklich einfache alternative für jedermann, der bereit ist, verwenden Sie eine textView. Ich merke, diese Frage ist über ein UILabel aber wenn Sie die Kommentare Lesen, auf einige der Antworten, die Sie nicht für einige Leute arbeiten und einige von Ihnen sind sehr code schwer was nicht sehr gut für Anfänger. Sie können dies tun, in 11 einfachen Schritten, wenn Ihr bereit swap-out UILabel für einen UITextView.
Können Sie
NSMutableAttributedString
und einUITextView
. Der UITextView hat eine delegate-Methodefunc textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
. Wenn Sie den Teil der Zeichenfolge, die Sie wollen, um antipp-die delegate-Methode aktivieren.Die 11 Schritte aufgeführt sind unten in die Kommentare über jedes Stück code.
InformationsquelleAutor Lance Samaria
Ihre text-kit stack defekt ist. Sie vergaß hinzuzufügen, der text container für die layout-manager! Deshalb gibt es keinen text, lay-out, und der layout-manager kann nicht berichten alle Glyphen rect. Daher Glyphe rect ist NSRectZero, das ist, warum Sie nie ein Bericht Tippen.
Ein weiteres problem ist, dass Sie anrufen
characterRangeForGlyphRange
wenn Sie aufrufen werden sollteglyphRangeForCharacterRange
, und Sie scheinen nicht zu wissen, wie das Ergebnis (in der Tat, Sie wegzuwerfen, das Ergebnis).Hier funktioniert der code zeigt nur den Teil über die Verwendung der text-stack. Ich beginne mit einem string "Hallo". Ich werde zeigen, wie zu erfahren, wo die REK für "zu" ist:
Das Ergebnis ist
{x 30.68 y 0 w 10.008 h 13.8}
. Jetzt können wir gehen, um zu testen, ob ein Tippen in das Rechteck. Gehe Hin Und Tue Desgleichen.wo ist der Aufkleber?
InformationsquelleAutor matt
swift 4.2
Finden Sie die Lösung hier für immer bestimmte text
action
vonLabel
.1) Deklaration
2) Satz zugeschrieben text auf dem Etikett
Sieht es aus wie das Bild oben.
3) Fügen Sie die tapLable action-Methode des Controllers
4)
UITapGestureRecognizer
ErweiterungGlück! 🙂
InformationsquelleAutor Ilesh
Für mehrzeilige Etiketten, die Sie haben, um die textStorage schriftart oder die falsche Auswahl zurückgegeben werden
Gibt es viele Antworten auf diese Frage. Es gibt jedoch viele Menschen beschweren sich, dass das Tippen fällt für mehrzeilige Beschriftungen und das ist richtige für die meisten Antworten auf dieser Seite. Die falsche Auswahl für das Tippen zurückgegeben wird, weil der
textStorage
nicht die richtige schriftart.Beheben Sie das Problem schnell, indem Sie hinzufügen, die richtige schriftart zu Ihrem
textStorage
Beispiel:Setzen Sie alle zusammen erhalten Sie so etwas wie dieses:
InformationsquelleAutor DoesData