bagaimana saya bisa mendeteksi acara sentuh dari UIImageView

97

Saya telah menempatkan gambar (UIImageView) di bilah navigasi. Sekarang saya ingin mendeteksi acara sentuh dan ingin menangani acara tersebut. Bisakah Anda memberi tahu saya bagaimana saya bisa melakukan itu?

Terima kasih.

ebaccount
sumber
Dalam situasi ini saya akan (dan berpikir Anda harus) menggunakan UIButton kustom sebagai gantinya.
titaniumdecoy
Periksa versi Swift Jawaban http://stackoverflow.com/a/41328885/3177007
Mohamed Jaleel Nazir

Jawaban:

137

Secara praktis, jangan lakukan itu.

Sebagai gantinya, tambahkan tombol dengan gaya Kustom (tanpa grafik tombol kecuali Anda menentukan gambar) di UIImageView. Kemudian lampirkan metode apa pun yang ingin Anda panggil ke sana.

Anda dapat menggunakan teknik itu untuk banyak kasus di mana Anda benar-benar ingin beberapa area layar berfungsi sebagai tombol alih-alih mengotak-atik barang-barang Touch.

Kendall Helmstetter Gelner
sumber
Saya telah menambahkan tombol di bilah navigasi dan saya juga dapat menangani peristiwa sentuh. Namun, saya ingin menambahkan gambar bulat pada tombol ini. Bisakah Anda memberi tahu saya bagaimana saya bisa melakukan itu secara terprogram? Selain itu, dapatkah Anda memberi tahu saya bagaimana cara menyetel properti tombol ke "kustom" secara terprogram?
ebaccount
Lihat dokumen untuk UIButton - Anda perlu menyetel gambar latar belakang untuk status kontrol, Anda akan menginginkan gambar yang berbeda untuk Normal vs. Dipilih / Disorot. Gaya tombol adalah apa yang Anda setel ke UIButtonStyleCustom, saya yakin - sekali lagi, lihat dokumen untuk properti gaya di UIButton.
Kendall Helmstetter Gelner
1
Bukankah menambahkan UIButton di atas UIImageView sedikit di atas? Anda menambahkan objek tambahan, sedangkan Anda bisa mengimplementasikan metode sentuhan dari objek UIImageView yang sudah ada. Tidak?
samvermette
32
Jika Anda melihat ukuran UIButton di memori, hampir tidak ada dan Anda hanya memiliki beberapa tombol per layar. Apa yang Anda dapatkan secara gratis adalah seluruh kabel tindakan target untuk keadaan yang berbeda (seperti sentuhan di dalam) dan juga perilaku yang baik seperti tidak memicu saat Anda menekan tetapi menggeser jari ke samping. Pada dasarnya tombol adalah salah satu objek yang dibuat paling bagus di seluruh sistem dan berpikir Anda akan melakukan kode sentuh khusus yang bekerja lebih baik adalah kegilaan. Gunakan yang murah dan berfungsi dengan baik, simpan pekerjaan khusus untuk hal-hal yang belum ditangani kerangka kerja untuk Anda.
Kendall Helmstetter Gelner
6
Anda juga dapat melapisi UIControl jika yang Anda butuhkan hanyalah kejadian sentuh (melalui addTaget: action: forControlEvents :). Ini sedikit lebih murah daripada UIButton yang memiliki gambar dan beberapa status. Juga, saya menggunakan praprosesor kondisional untuk mengubah warna latar belakang kontrol overlay menjadi merah muda sehingga saya dapat melihat dengan tepat di mana mereka (dan ingat bahwa mereka ada :-).
Jeff
115

A UIImageViewditurunkan dari a UIViewyang diturunkan UIRespondersehingga siap untuk menangani kejadian sentuh. Anda akan ingin memberikan touchesBegan, touchesMoveddan touchesEndedmetode dan mereka akan dipanggil jika pengguna mengetuk gambar. Jika yang Anda inginkan hanyalah acara ketuk, lebih mudah menggunakan tombol khusus dengan gambar disetel sebagai gambar tombol. Tetapi jika Anda ingin kontrol yang lebih baik atas ketukan, gerakan, dll. Ini adalah cara yang tepat.

Anda juga ingin melihat beberapa hal lagi:

  • Timpa canBecomeFirstResponderdan kembali YA untuk menunjukkan bahwa tampilan dapat menjadi fokus peristiwa sentuh (standarnya adalah TIDAK).

  • Setel userInteractionEnabledproperti ke YA. Default untuk UIViewsadalah YA, tetapi untuk UIImageViewsTIDAK jadi Anda harus menyalakannya secara eksplisit.

  • Jika Anda ingin menanggapi peristiwa multi-sentuh (misalnya mencubit, memperbesar, dll.), Anda harus menyetel multipleTouchEnabledke YA.

Ramin
sumber
Saya mencobanya tetapi tidak pernah kurang saya tidak menerima peristiwa touchesBegan ... mengapa begitu?
Markus
5
@ Markus: Saya memiliki masalah yang sama, tetapi memperbaikinya dengan menyetel userInteractionEnabledke YA pada tampilan orang tua saya. Lihat stackoverflow.com/questions/5887305/…
Saxon Druce
51

Untuk menambahkan peristiwa sentuh ke UIImageView, gunakan yang berikut ini di .m Anda

UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


-(void)myTapMethod{
    // treat image tap
}

semoga membantu.

Ya.
sumber
userInteractionEnabled = true bagian yang mudah dilupakan, terima kasih.
Michael Peterson
23

Anda juga dapat menambahkan UIGestureRecognizer. Ini tidak mengharuskan Anda untuk menambahkan elemen tambahan dalam hierarki tampilan Anda, tetapi tetap memberi Anda semua kode yang ditulis dengan baik untuk menangani kejadian sentuh dengan antarmuka yang cukup sederhana:

    UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
    [imgView_ addGestureRecognizer:swipeRight];        
    [swipeRight release];
    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [imgView_ addGestureRecognizer:swipeLeft];
    [swipeLeft release];
spolu
sumber
10
JANGAN lupa untuk mengatur UserInteractionEnabled untuk imgView_
Anonymous White
13

Saya telah berada di utas yang berbeda dalam beberapa jam terakhir mencoba menemukan solusi untuk masalah saya, tetapi tidak berhasil. Saya melihat banyak pengembang berbagi masalah ini, dan saya pikir orang-orang di sini tahu tentang ini. Saya memiliki banyak gambar di dalam UIScrollView, mencoba untuk mendapatkan peristiwa tap di dalamnya.

tidak mendapatkan acara apa pun dari UIImangeView, tetapi saya mendapatkan acara dari serupa UILabledengan parameter yang sangat mirip yang saya tetapkan untuk itu. di bawah IOS 5.1.

Saya telah melakukan hal berikut:

  1. setel setUserInteractionEnabled ke YES untuk `UIImageView dan tampilan induk.
  2. setel setMultipleTouchEnabled ke YES untuk UIImageView.
  3. Mencoba subclassing UIImageView, tidak membantu apapun.

Melampirkan beberapa kode di bawah ini, dalam kode ini saya menginisialisasi a UIImageViewdan UILabel, label berfungsi dengan baik dalam hal peristiwa pengaktifan. Saya mencoba menyembunyikan kode yang tidak relevan. Terima kasih teman-teman, Ilan

UIImageView *single_view = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)];
single_view.image=img;
single_view.layer.zPosition=4;

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[single_view addGestureRecognizer:singleTap];
[single_view setMultipleTouchEnabled:YES];
[single_view setUserInteractionEnabled:YES];
[self.myScrollView addSubview:single_view];    
self.myScrollView.userInteractionEnabled=YES;

UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
testLabel.backgroundColor=[UIColor redColor];
[self.myScrollView addSubview:testLabel];
[testLabel addGestureRecognizer:singleTap];  
[testLabel setMultipleTouchEnabled:YES];
[testLabel setUserInteractionEnabled:YES];
testLabel.layer.zPosition=4;

Dan metode yang menangani acara tersebut:

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{ 
    UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
    NSLog(@"Touch event on view: %@",[tappedView class]);
}

Seperti yang dikatakan, keran label diterima.

ilan
sumber
6

Alih-alih membuat UIImageView yang bisa disentuh lalu menempatkannya di navbar, Anda sebaiknya membuat UIBarButtonItem, yang Anda buat dari UIImageView.

Pertama buat tampilan gambar:

UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];

Kemudian buat item barbutton dari tampilan gambar Anda:

UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];

Kemudian tambahkan item tombol bar ke bar navigasi Anda:

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

Ingatlah bahwa kode ini masuk ke pengontrol tampilan yang ada di dalam larik pengontrol tampilan pengontrol navigasi. Jadi pada dasarnya, "item tombol bilah yang tampak seperti gambar yang dapat disentuh" ​​ini hanya akan muncul di bilah navigasi saat pengontrol tampilan ini saat ditampilkan. Saat Anda menekan pengontrol tampilan lain, item tombol bilah navigasi ini akan hilang ~

yujean
sumber
3

Apa yang mungkin ingin Anda lakukan adalah mengganti touchesBegan:withEvent:metode UIView(atau subclass) yang berisi UIImageViewsubview Anda .

Dalam metode ini, uji apakah ada UITouchsentuhan yang berada di dalam batas UIImageViewinstance (katakanlah disebut imageView).

Artinya, apakah CGPointelemen tersebut [touch locationInView]bersinggungan dengan CGRectelemen [imageView bounds]? Perhatikan fungsi CGRectContainsPointuntuk menjalankan pengujian ini.

Alex Reynolds
sumber
Terima kasih untuk balasan Anda. Saya telah menambahkan tampilan seperti ini: [navBar addSubview: self.pImage]; // ditambahkan sebagai subview dari bilah navigasi. Saya telah mengganti fungsinya tetapi fungsinya tidak pernah dipanggil. Saya telah menyetel properti userInteractionEnabled dari UIImageView menjadi YES. Apakah saya melewatkan sesuatu?
ebaccount
Lihat metode touchesBegan: withEvent:. Ada banyak contoh di mesin pencari tentang cara kerjanya.
Alex Reynolds
1

Pertama Anda harus menempatkan UIButton lalu Anda dapat menambahkan gambar latar belakang untuk tombol ini atau Anda perlu menempatkan UIImageView di atas tombol.

atau

Anda bisa menambahkan isyarat ketuk ke UIImageView sehingga mendapatkan tindakan klik saat mengetuk UIImageView.

Hilaj
sumber
0

Bagi Anda yang mencari solusi Swift 4 untuk jawaban ini. Anda dapat menggunakan berikut ini untuk mendeteksi kejadian sentuh di UIImageView.

let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true

Anda kemudian perlu menentukan pemilih Anda sebagai berikut:

@objc func imageViewTapped() {
    // Image has been tapped
}
Josh
sumber
-2

Tambahkan gestur pada view tersebut. Tambahkan image ke view tersebut maka gesture tersebut akan mendeteksi gesture pada image juga. Bisakah Anda coba dengan metode delegate event sentuh maka dalam hal itu juga mungkin terdeteksi. Terima kasih

pengguna1240409
sumber