Katakanlah kita memiliki pengontrol tampilan dengan satu tampilan sub. subview mengambil bagian tengah layar dengan margin 100 px di semua sisi. Kami kemudian menambahkan banyak hal kecil untuk diklik di dalam subview itu. Kami hanya menggunakan subview untuk memanfaatkan frame baru (x = 0, y = 0 di dalam subview sebenarnya 100.100 dalam tampilan induk).
Lalu, bayangkan kita memiliki sesuatu di balik layar, seperti menu. Saya ingin pengguna dapat memilih "hal-hal kecil" di subview, tetapi jika tidak ada, saya ingin sentuhan untuk melewatinya (karena latar belakangnya jelas) ke tombol di belakangnya.
Bagaimana saya bisa melakukan ini? Sepertinya sentuhan Mulai, tapi tombol tidak berfungsi.
ios
objective-c
iphone
cocoa-touch
ipad
Sean Clark Hess
sumber
sumber
UIButton
yang di bawah semi transparanUIView
sedangkan bagian yang tidak transparanUIView
masih akan menanggapi acara sentuh.Jawaban:
Buat tampilan khusus untuk wadah Anda dan timpa pesan pointInside: untuk mengembalikan false ketika titik tersebut tidak dalam tampilan anak yang memenuhi syarat, seperti ini:
Cepat:
Sasaran C:
Menggunakan tampilan ini sebagai wadah akan memungkinkan anak-anaknya untuk menerima sentuhan tetapi tampilan itu sendiri akan transparan untuk acara.
sumber
Saya juga menggunakan
Tidak perlu subkelas. Bekerja dengan baik.
sumber
Dari Apple:
Praktik Terbaik Apel :
alih-alih, Anda dapat mengganti:
di subkelas UIView Anda dan kembalikan NO jika Anda ingin sentuhan itu dikirim ke rantai responden (yaitu untuk melihat di belakang pandangan Anda tanpa apa-apa di dalamnya).
sumber
NO
;Cara yang jauh lebih sederhana adalah dengan "Tidak Periksa" Interaksi Pengguna Diaktifkan di pembuat antarmuka. "Jika kamu menggunakan storyboard"
sumber
Berdasarkan apa yang diposkan John, berikut adalah contoh yang akan memungkinkan acara sentuh untuk melewati semua tampilan sub tampilan kecuali untuk tombol:
sumber
UIView
subkelasPassThroughView
yang hanya menimpa-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { return YES; }
jika Anda ingin meneruskan acara sentuh apa pun di bawah tampilan.Akhir-akhir ini saya menulis sebuah kelas yang akan membantu saya dengan hal itu. Menggunakannya sebagai kelas khusus untuk
UIButton
atauUIView
akan melewati acara sentuh yang dieksekusi pada piksel transparan.Solusi ini agak lebih baik daripada jawaban yang diterima karena Anda masih bisa mengklik
UIButton
yang di bawah semi transparanUIView
sedangkan bagian yang tidak transparanUIView
masih akan merespons acara sentuh.Seperti yang dapat Anda lihat di GIF, tombol Giraffe adalah persegi panjang sederhana tetapi peristiwa sentuh pada area transparan diteruskan ke kuning di
UIButton
bawahnya.Tautan ke kelas
sumber
Solusi pilihan teratas tidak sepenuhnya berfungsi untuk saya, saya kira itu karena saya memiliki TabBarController ke dalam hierarki (seperti yang ditunjukkan salah satu komentar) itu sebenarnya meneruskan sentuhan ke beberapa bagian UI tetapi itu mengacaukan saya Kemampuan tableView untuk mencegat acara sentuh, yang akhirnya melakukannya adalah menabrak hitTest dalam tampilan yang ingin saya abaikan sentuhan dan biarkan subview dari tampilan itu menanganinya.
sumber
Cepat 3
sumber
Menurut 'Panduan Pemrograman Aplikasi iPhone':
http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html
Diperbarui : Contoh dihapus - baca kembali pertanyaan ...
Apakah Anda memiliki gerakan memproses pada pandangan yang mungkin memproses keran sebelum tombol mendapatkannya? Apakah tombol berfungsi ketika Anda tidak memiliki tampilan transparan di atasnya?
Adakah contoh kode dari kode yang tidak berfungsi?
sumber
Sejauh yang saya tahu, Anda seharusnya dapat melakukan ini dengan mengesampingkan metode hitTest : . Saya memang mencobanya tetapi tidak bisa berfungsi dengan benar.
Pada akhirnya saya membuat serangkaian pandangan transparan di sekitar objek yang dapat disentuh sehingga mereka tidak menutupinya. Sedikit peretasan untuk masalah saya ini bekerja dengan baik.
sumber
Mengambil kiat dari jawaban lain dan membaca dokumentasi Apple, saya membuat pustaka sederhana ini untuk menyelesaikan masalah Anda:
https://github.com/natrosoft/NATouchThroughView
Memudahkan untuk menggambar tampilan di Interface Builder yang harus melalui sentuhan hingga pandangan yang mendasarinya.
Saya pikir metode swizzling berlebihan dan sangat berbahaya untuk dilakukan dalam kode produksi karena Anda secara langsung mengacaukan implementasi basis Apple dan membuat perubahan di seluruh aplikasi yang dapat menyebabkan konsekuensi yang tidak diinginkan.
Ada proyek demo dan semoga README melakukan pekerjaan dengan baik menjelaskan apa yang harus dilakukan. Untuk mengatasi OP, Anda akan mengubah UIView jelas yang berisi tombol ke kelas NATouchThroughView di Interface Builder. Kemudian temukan UIView yang jelas yang menampilkan menu yang ingin Anda ketuk. Ubah UIView ke kelas NARootTouchThroughView di Interface Builder. Ia bahkan bisa menjadi root UIView pada pengontrol tampilan Anda jika Anda bermaksud sentuhan itu untuk melewati ke pengontrol tampilan yang mendasarinya. Lihat proyek demo untuk melihat cara kerjanya. Ini sangat sederhana, aman, dan non-invasif
sumber
Saya membuat kategori untuk melakukan ini.
sebuah metode kecil berputar-putar dan pemandangannya berwarna emas.
Header
File implementasi
Anda perlu menambahkan Swizz.h dan Swizz.m saya
terletak di sini
Setelah itu, Anda cukup Mengimpor UIView + PassthroughParent.h di file {Project} -Prefix.pch Anda, dan setiap tampilan akan memiliki kemampuan ini.
setiap tampilan akan mengambil poin, tetapi tidak ada ruang kosong yang mau.
Saya juga merekomendasikan menggunakan latar belakang yang jelas.
EDIT
Saya membuat tas properti saya sendiri, dan itu belum termasuk sebelumnya.
File tajuk
File Implementasi
sumber
pointInside: withEvent:
?Jika Anda tidak dapat repot-repot menggunakan UIView kategori atau subkelas, Anda juga bisa membawa tombol ke depan sehingga berada di depan tampilan transparan. Ini tidak akan selalu mungkin tergantung pada aplikasi Anda, tetapi itu berhasil untuk saya. Anda selalu dapat mengembalikan tombol atau menyembunyikannya.
sumber
Coba ini
sumber
Coba atur a
backgroundColor
transparentView
sebagai AndaUIColor(white:0.000, alpha:0.020)
. Kemudian Anda bisa mendapatkan acara sentuh ditouchesBegan
/touchesMoved
metode. Tempatkan kode di bawah ini di tempat tampilan Anda:sumber
Saya menggunakan itu alih-alih menimpa titik metode (di dalam: CGPoint, dengan: UIEvent)
sumber