Menangani Peristiwa Sentuhan di UILabel dan menghubungkannya dengan IBAction

101

Ok, jadi saya telah UILabelmembuat di pembuat antarmuka yang menampilkan beberapa teks default "ketuk untuk memulai".

Saat pengguna mengetuk UILabelI want it to trigger an IBAction method: -(IBAction)next;yang memperbarui teks pada label untuk mengatakan sesuatu yang baru.
Akan sangat nyaman jika ini memungkinkan saya untuk menarik koneksi dari metode saya ke label saya dan kemudian memilih sentuh di dalam, seperti dengan tombol. tapi sayang, tidak ada cerutu.

jadi bagaimanapun, saya kira pertanyaan saya adalah, apakah saya harus subkelas UILabelagar ini berfungsi? Atau adakah cara untuk menarik tombol ke atas label, tetapi membuatnya 0% buram. Atau apakah ada solusi sederhana yang saya lewatkan?

wfbarksdale.dll
sumber

Jawaban:

255

Saksikan berikut ini:

UILabel *label = ...
label.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture =
      [[UITapGestureRecognizer alloc] initWithTarget:self 
                                              action:@selector(labelTap)];
[label addGestureRecognizer:tapGesture];

Triknya adalah dengan mengaktifkan interaksi pengguna.

Scott Persinger
sumber
1
Bagaimana jika saya memiliki banyak label? bagaimana saya bisa membedakan mana yang disadap?
pelajar
1
@learner coba properti tag. pastikan untuk menggunakan labelTap: sebagai ganti labelTap. dan gunakan - (void) labelTap: (id) sender ;.
thedjaney
1
@thedjaney Pengirimnya adalah UITapGestureRecognizer, bukan UILabel
h4labs
TapGestureRecognizer tidak sama dengan sentuhan di dalam, dan kehilangan kesesuaian dan aksesibilitas antarmuka manusia.
1
@ h4labs Anda dapat menggunakan UITapGestureRecognizer * tapGesture = sender; kemudian dapatkan label tag dengan tapGesture.view.tag
DJTano
70

UILabel mewarisi dari UIView yang diwarisi dari UIResponder. Semua objek UIresponder dapat menangani peristiwa sentuh. Jadi di file kelas Anda yang mengetahui tentang tampilan Anda (yang berisi UIlabel) implementasikan:

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event;

Dalam pembuat antarmuka, setel nilai tag UILabel. ketika sentuhan terjadi dalam metode touchesBegan Anda, periksa nilai tag dari tampilan yang memiliki tag:

UITouch *touch = [touches anyObject];

if(touch.view.tag == MY_TAG_VAL)
label.text = @"new text";

Anda menghubungkan kode Anda di file kelas dengan objek UILabel di pembuat antarmuka dengan mendeklarasikan variabel instance UILabel Anda dengan awalan IBOutlet:

IBOutlet UILabel *label;

Kemudian di pembuat antarmuka Anda dapat menghubungkannya.

Penghilang
sumber
31
Satu catatan, Anda harus memastikan Anda mencentang "Interaksi Pengguna Diaktifkan" di pembuat antarmuka, atau ini tidak akan berfungsi.
midas06
Saya mengalami satu masalah dengan metode ini. Ini bekerja dengan baik ketika pengontrol tampilan dimuat secara langsung, tetapi ketika saya membuat pengontrol nav, mendorong pengontrol yang berisi label ke pengontrol nav dan kemudian menampilkannya, sentuhan sepertinya tidak sampai ke label lagi. Ada Ide?
midas06
jika kelas pengontrol tampilan yang sama yang Anda dorong, seharusnya berfungsi. sepertinya masih ada masalah kecil lainnya. mungkin memulai pertanyaan lain dan memposting beberapa kode
Remover
5
Metode serupa yang tidak memerlukan tag adalah dengan memeriksa apakah touch.view sama dengan outlet yang Anda tetapkan untuk label. Saya lebih suka ini, karena ini berarti saya tidak perlu melacak tag.
Defragmentasi
solusi yang bagus. Saya menyarankan agar Anda tidak menyetel tag apa pun menjadi 0 karena mengeklik di mana pun juga memiliki nilai tag 0. Ini karena tampilan Anda kemungkinan besar akan memiliki nilai tag 0. Jika tidak, Anda dapat menyetel tag tampilan Anda ke sesuatu seperti -1 dan kemudian Anda dapat menggunakan nilai tag 0 di tempat lain yaitu tombol
kevinl
30

Anda dapat menggunakan UIButton, membuatnya transparan, yaitu tipe kustom tanpa gambar, dan menambahkan UILabel di atasnya (di tengah). Kemudian pasang acara tombol normal.

Eiko
sumber
Saya setuju, jenis tombol kustom akan memberikan Anda pengalaman pengguna jenis UILabel.
stitz
2
+1, bagus dan sederhana. Saya telah mencoba ini sebelumnya dengan mengatur tombol normal ke opactiy 0 yang tidak berfungsi, tetapi tip untuk mengubah jenis menjadi kustom berfungsi dengan sempurna.
Brian Moeskau
Opacity akan mempengaruhi tombol dan semua subviewnya, jadi opacity = 0 akan membuat semuanya tidak terlihat.
Eiko
10
Astaga. Ini adalah peretasan dibandingkan dengan solusi lain di utas ini. Gunakan pengenal gerakan ketuk pada label jika Anda ingin mengenali gerakan ketuk pada label. (Lihat bagaimana bunyinya seperti yang dimaksudkan untuk ini?)
James Boutcher
Ini adalah solusi yang jauh lebih baik karena tombol menangani sentuhan di dalam daripada hanya ketukan (mulai).
17

Cepat 3

Anda memiliki IBOutlet

@IBOutlet var label: UILabel!

Di mana Anda mengaktifkan interaksi pengguna dan menambahkan pengenal isyarat

label.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(userDidTapLabel(tapGestureRecognizer:)))
label.addGestureRecognizer(tapGesture)

Dan terakhir, tangani keran

func userDidTapLabel(tapGestureRecognizer: UITapGestureRecognizer) {
  // Your code goes here
}
César Cruz
sumber
2
Saya harus menambahkan @objc ke userDidTapLabel agar ini berfungsi. Mungkin 4 hal yang cepat.
Sesuai POSIX