Bagaimana cara agar UILabel menanggapi tap?


94

Saya telah menemukan bahwa saya dapat membuat UILabel jauh lebih cepat daripada UITextField dan saya berencana untuk menggunakan UILabel sebagian besar waktu untuk aplikasi tampilan data saya.

Untuk membuat cerita panjang pendek, saya ingin membiarkan pengguna mengetuk UILabel dan meminta panggilan balik saya menanggapinya. Apakah itu mungkin?

Terima kasih.


1
Anda perlu menentukanuserInteractionEnabled = true
onmyway133

Jawaban:


208

Anda dapat menambahkan sebuah UITapGestureRecognizerinstance ke UILabel Anda.

Sebagai contoh:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTapped)];
tapGestureRecognizer.numberOfTapsRequired = 1;
[myLabel addGestureRecognizer:tapGestureRecognizer];
myLabel.userInteractionEnabled = YES;

13
Aha, properti 'userInteractionEnabled' di sini adalah kuncinya (karena konfigurasi lain dapat dan sebaiknya disetel di storyboard). Label secara default, interaksi dinonaktifkan agar dapat melewati sentuhan melalui mereka - tetapi dalam hal ini mereka perlu mengamati sentuhan agar pengenal isyarat dapat diaktifkan. Terima kasih!
Marchy

1
Bagus! Saya baru saja mengetuk label dan benar-benar lupa mengaktifkan interaksi pengguna. Terima kasih!
Mike Critchley

37

Jika Anda menggunakan papan cerita, Anda dapat melakukan seluruh proses ini di papan cerita tanpa kode tambahan. Tambahkan label ke papan cerita, lalu tambahkan gerakan ketukan ke label. Di panel Utilities, pastikan "Interaksi Pengguna Diaktifkan" dicentang untuk label. Dari gerakan ketuk (di bagian bawah pengontrol tampilan di storyboard), ctrl + klik dan seret ke file ViewController.h Anda dan buat Tindakan. Kemudian implementasikan tindakan di file ViewController.m.


Metode juga tersedia menggunakan pembuat antarmuka saja tanpa papan cerita
Gomino

Pastikan "Interaksi Pengguna Diaktifkan" dicentang di bawah bagian Tampilan di inspektur Atribut , bukan hanya Sifat Aksesibilitas.
SeanR

17

Swift 3.0.0

Inisialisasi isyarat untuk tempLabel

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

Penerima tindakan

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

Swift 4.0.0

Inisialisasi isyarat untuk tempLabel

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

Penerima tindakan

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

Bagaimana cara mendapatkan teks label dari objek pengirim? Dengan kata lain, bagaimana cara mengidentifikasi pengirimnya?
Vineel

Versi Swift 4 memiliki @selector, bukan #selector.
Kirby Todd

8

Swift 2.0:

Saya menambahkan string nsmutable sebagai teks sampleLabel, mengaktifkan interaksi pengguna, menambahkan isyarat ketukan dan memicu metode.

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

4

Anda dapat menggunakan UIButton dan mengatur teks sesuai keinginan Anda. Tombol tersebut tidak harus terlihat seperti tombol jika Anda tidak menginginkannya


1
Sehubungan dengan itu, saya selalu mengalami masalah dengan teks multi-baris pembenaran kiri UIButton. Bahkan ketika saya mengatur perataan kiri ke tengah itu masih terjadi.
Senang

Saya memang mencoba UIButton dan itu cukup bagus. Hanya tombol multi-baris yang menjadi masalah. Terima kasih.
Selamat tanggal

3

Untuk menambahkan gerakan Tap pada UILable

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];   

dan untuk menilai metode pemilih

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

}

Catatan: Tambahkan UIGestureRecognizerDelegate dalam file .h


2

Versi Swift: var tapGesture : UITapGestureRecognizer = UITapGestureRecognizer()

Lalu di dalam viewDidLoad(), tambahkan ini:

  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:")

1

Jika Anda ingin menggunakan teks Multi baris di tombol Anda, buatlah UILabeldengan teks Multiline dan tambahkan sebagai subview ke tombol Anda.

misalnya:

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

1

Swift 3 dari 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")
}

0

Versi Swift terlihat seperti ini:

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

0

Saya pribadi lebih suka metode penulisan ekstensi untuk UILabel. Ini yang saya gunakan.

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()]?()
    }
}

Anda kemudian akan menggunakannya seperti ini dari setiap instance UILabel:

myLabel.setOnTapped {
    // do something
}

Ini berpotensi menyebabkan beberapa kebocoran memori yang saya yakini, tetapi saya belum menentukan cara terbaik untuk mengatasinya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.