Wie kann UILabel auf Tippen reagieren?

94

Ich habe festgestellt, dass ich UILabel viel schneller als UITextField erstellen kann, und ich plane, UILabel die meiste Zeit für meine Datenanzeige-App zu verwenden.

Um es kurz zu machen, ich möchte den Benutzer auf ein UILabel tippen lassen und meinen Rückruf darauf reagieren lassen. Ist das möglich?

Vielen Dank.

glücklich
quelle
1
Sie müssen angebenuserInteractionEnabled = true
onmyway133

Antworten:

208

Sie können UITapGestureRecognizerIhrem UILabel eine Instanz hinzufügen.

Beispielsweise:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTapped)];
tapGestureRecognizer.numberOfTapsRequired = 1;
[myLabel addGestureRecognizer:tapGestureRecognizer];
myLabel.userInteractionEnabled = YES;
Pythonquick
quelle
13
Aha, die Eigenschaft 'userInteractionEnabled' ist hier der Schlüssel (da die andere Konfiguration vorzugsweise in Storyboards festgelegt werden kann und sollte). Bei der Beschriftung ist die Interaktion standardmäßig deaktiviert, um Berührungen zu durchlaufen. In diesem Fall müssen sie jedoch Berührungen beobachten, damit der Gestenerkenner aktiviert wird. Vielen Dank!
Marchy
1
Schön! Ich habe gerade einen Tipp auf ein Etikett geworfen und völlig vergessen, die Benutzerinteraktion zu aktivieren. Vielen Dank!
Mike Critchley
37

Wenn Sie Storyboards verwenden, können Sie diesen gesamten Vorgang im Storyboard ohne zusätzlichen Code ausführen. Fügen Sie dem Storyboard eine Beschriftung hinzu und fügen Sie der Beschriftung eine Tippgeste hinzu. Stellen Sie im Bereich Dienstprogramme sicher, dass "Benutzerinteraktion aktiviert" für die Bezeichnung aktiviert ist. Drücken Sie in der Tap-Geste (unten im View-Controller im Storyboard) bei gedrückter Strg-Taste und ziehen Sie sie in Ihre ViewController.h-Datei und erstellen Sie eine Aktion. Implementieren Sie dann die Aktion in der Datei ViewController.m.

leenyburger
quelle
Methode auch mit Interface Builder allein ohne Storyboards verfügbar
Gomino
Stellen Sie sicher , dass „Benutzerinteraktion aktiviert“ wird unter dem geprüft Ansicht Abschnitt in der Attribute - Inspektor, nicht nur die Zugänglichkeit Traits.
SeanR
17

Swift 3.0

Initialisieren Sie die Geste für tempLabel

tempLabel?.text = "Label"
let tapAction = UITapGestureRecognizer(target: self, action: #selector(self.actionTapped(_:)))
tempLabel?.isUserInteractionEnabled = true
tempLabel?.addGestureRecognizer(tapAction)

Aktionsempfänger

func actionTapped(_ sender: UITapGestureRecognizer) {
    // code here
}

Swift 4.0

Initialisieren Sie die Geste für tempLabel

tempLabel?.text = "Label"
let tapAction = UITapGestureRecognizer(target: self, action:@selector(actionTapped(_:)))
tempLabel?.isUserInteractionEnabled = true
tempLabel?.addGestureRecognizer(tapAction)

Aktionsempfänger

func actionTapped(_ sender: UITapGestureRecognizer) {
    // code here
}
Koushik
quelle
Wie erhalte ich den Beschriftungstext vom Absenderobjekt? Mit anderen Worten, wie kann man den Absender identifizieren?
Vineel
Die Swift 4-Version hat @selector anstelle von #selector.
Kirby Todd
8

Swift 2.0:

Ich füge eine nsmutable-Zeichenfolge als Text von sampleLabel hinzu, um die Benutzerinteraktion zu ermöglichen, eine Tippgeste hinzuzufügen und eine Methode auszulösen.

override func viewDidLoad() {
    super.viewDidLoad()

    let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
    newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleDouble.rawValue], range: NSMakeRange(4, 4))
    sampleLabel.attributedText = newsString.copy() as? NSAttributedString

    let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapResponse:")
    tapGesture.numberOfTapsRequired = 1
    sampleLabel.userInteractionEnabled =  true
    sampleLabel.addGestureRecognizer(tapGesture)

}
func tapResponse(recognizer: UITapGestureRecognizer) {
    print("tap")
}
AG
quelle
4

Sie können stattdessen einen UIButton verwenden und den Text auf das gewünschte Maß einstellen. Die Schaltfläche muss nicht wie eine Schaltfläche aussehen, wenn Sie nicht möchten

Matt S.
quelle
1
In Bezug darauf hatte ich immer Probleme mit dem linksbündigen mehrzeiligen Text von UIButton. Selbst wenn ich die linke Ausrichtung auf Mitte stelle, passiert dies immer noch.
Glücklicher
Ich habe UIButton allerdings ausprobiert und es ist ziemlich schön. Es sind nur die mehrzeiligen Tasten, die ein Problem darstellen. Vielen Dank.
Glücklicher
3

So fügen Sie eine Tippengeste auf UILable hinzu

UITapGestureRecognizer *tapAction = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(lblClick:)];
tapAction.delegate =self;
tapAction.numberOfTapsRequired = 1;

//Enable the lable UserIntraction
lblAction.userInteractionEnabled = YES;
[lblAction addGestureRecognizer:tapAction];   

und die Auswahlmethode zu bewerten

- (void)lblClick:(UITapGestureRecognizer *)tapGesture {

}

Hinweis: Fügen Sie UIGestureRecognizerDelegate in die .h-Datei ein

Hardik Thakkar
quelle
2

Schnelle Version: var tapGesture : UITapGestureRecognizer = UITapGestureRecognizer()

Fügen Sie dann Folgendes viewDidLoad()hinzu:

  let yourLbl=UILabel(frame: CGRectMake(x,y,width,height)) as UILabel!

    yourLbl.text = "SignUp"
    tapGesture.numberOfTapsRequired = 1
    yourLbl.addGestureRecognizer(tapGesture)
    yourLbl.userInteractionEnabled = true
    tapGesture.addTarget(self, action: "yourLblTapped:")
Aditya Jha
quelle
1

Wenn Sie UILabelmehrzeiligen Text in Ihrer Schaltfläche verwenden möchten, erstellen Sie einen Text mit mehrzeiligem Text und fügen Sie ihn als Unteransicht zu Ihrer Schaltfläche hinzu.

für zB:

yourLabel=[Uilabel alloc]init];
yourLabel.frame=yourButtom.Frame;//(frame size should be equal to your button's frame)
[yourButton addSubView:yourLabel]
Chandramani
quelle
1

Swift 3 von Alvin George

override func viewDidLoad() {
    super.viewDidLoad()
    let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
    newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.styleDouble.rawValue], range: NSMakeRange(4, 4))
    sampleLabel.attributedText = newsString.copy() as? NSAttributedString

    let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.tapResponse))
    tapGesture.numberOfTapsRequired = 1
    sampleLabel.isUserInteractionEnabled =  true
    sampleLabel.addGestureRecognizer(tapGesture)
}

func tapResponse(recognizer: UITapGestureRecognizer) {
    print("tap")
}
MRustamzade
quelle
0

Die Swift-Version sieht folgendermaßen aus:

func addGestureRecognizerLabel(){
    //Create a instance, in this case I used UITapGestureRecognizer,
    //in the docs you can see all kinds of gestures
    let gestureRecognizer = UITapGestureRecognizer()

    //Gesture configuration
    gestureRecognizer.numberOfTapsRequired = 1
    gestureRecognizer.numberOfTouchesRequired = 1
    /*Add the target (You can use UITapGestureRecognizer's init() for this)
    This method receives two arguments, a target(in this case is my ViewController) 
    and the callback, or function that you want to invoke when the user tap it view)*/
    gestureRecognizer.addTarget(self, action: "showDatePicker")

    //Add this gesture to your view, and "turn on" user interaction
    dateLabel.addGestureRecognizer(gestureRecognizer)
    dateLabel.userInteractionEnabled = true
}

//How you can see, this function is my "callback"
func showDatePicker(){
    //Your code here
    print("Hi, was clicked")
}

//To end just invoke to addGestureRecognizerLabel() when
//your viewDidLoad() method is called

override func viewDidLoad() {
    super.viewDidLoad()
    addGestureRecognizerLabel()
}
LeoGalante
quelle
0

Ich persönlich bevorzuge die Methode, eine Erweiterung für UILabel zu schreiben. Das benutze ich.

import UIKit

extension UILabel {
    /**
     * A map of actions, mapped as [ instanceIdentifier : action ].
     */
    private static var _tapHandlers = [String:(()->Void)]()

    /**
     * Retrieve the address for this UILabel as a String.
     */
    private func getAddressAsString() -> String {
        let addr = Unmanaged.passUnretained(self).toOpaque()
        return "\(addr)"
    }

    /**
     * Set the on tapped event for the label
     */
    func setOnTapped(_ handler: @escaping (()->Void)) {
        UILabel._tapHandlers[getAddressAsString()] = handler
        let gr = UITapGestureRecognizer(target: self, action: #selector(onTapped))
        gr.numberOfTapsRequired = 1
        self.addGestureRecognizer(gr)
        self.isUserInteractionEnabled = true
    }

    /**
     * Handle the tap event.
     */
    @objc private func onTapped() {
        UILabel._tapHandlers[self.getAddressAsString()]?()
    }
}

Sie würden es dann von jeder UILabel-Instanz aus wie folgt verwenden:

myLabel.setOnTapped {
    // do something
}

Dies kann möglicherweise zu Speicherlecks führen, die ich glaube, aber ich habe noch nicht festgelegt, wie sie am besten behoben werden können.

Nathan F.
quelle