Saya memiliki tampilan yang terhampar di atas banyak tampilan lainnya. Saya hanya menggunakan overaly untuk mendeteksi beberapa sentuhan pada layar, tetapi selain itu saya tidak ingin tampilan menghentikan perilaku tampilan lain di bawahnya, yaitu tampilan gulir, dll. Bagaimana cara meneruskan semua sentuhan melalui tampilan overlay ini? Ini adalah subkals dari UIView.
145
Jawaban:
Saya hanya perlu menonaktifkan interaksi pengguna!
Objective-C:
Cepat:
sumber
myWebView.isUserInteractionEnabled = false
Untuk meneruskan sentuhan dari tampilan hamparan ke tampilan di bawahnya, terapkan metode berikut di UIView:
Objective-C:
Cepat 5:
sumber
Ini adalah utas lama, tetapi muncul pada pencarian, jadi saya pikir saya akan menambahkan 2c saya. Saya memiliki UIView yang mencakup subview, dan hanya ingin mencegat sentuhan yang mengenai salah satu subview, jadi saya memodifikasi jawaban PixelCloudSt untuk
sumber
Versi jawaban @fresidue yang ditingkatkan. Anda dapat menggunakan
UIView
subclass ini sebagai tampilan transparan yang meneruskan sentuhan di luar subviewnya. Implementasi di Objective-C :.
dan di Swift:
TIP:
Misalnya Anda memiliki panel "dudukan" besar, mungkin dengan tampilan meja di belakang. Anda membuat panel "pemegang"
PassthroughView
. Sekarang akan bekerja, Anda dapat menggulir tabel "melalui" pemegang ".Tapi!
Di atas panel "pemegang" Anda memiliki beberapa label atau ikon. Jangan lupa, tentu saja itu semua harus ditandai interaksi pengguna diaktifkan NONAKTIF!
Di atas panel "pemegang" Anda memiliki beberapa tombol. Jangan lupa, tentu saja itu hanya harus ditandai interaksi pengguna diaktifkan ON!
Perhatikan bahwa agak membingungkan, "pemegang" itu sendiri - tampilan yang Anda gunakan
PassthroughView
- harus ditandai interaksi pengguna diaktifkan AKTIF ! Itu ON !! (Jika tidak, kode di PassthroughView tidak akan pernah dipanggil.)sumber
$0.isUserInteractionEnabled
Saya memiliki masalah serupa dengan UIStackView (tetapi bisa jadi tampilan lain). Konfigurasi saya adalah sebagai berikut:
Ini adalah kasus klasik di mana saya memiliki wadah yang perlu ditempatkan di latar belakang, dengan tombol di samping. Untuk tujuan tata letak, saya menyertakan tombol dalam UIStackView, tetapi sekarang bagian tengah (kosong) dari penyadapan stackView menyentuh :-(
Apa yang saya lakukan adalah membuat subclass UIStackView dengan properti yang mendefinisikan subView yang harus dapat disentuh. Sekarang, setiap sentuhan pada tombol samping (termasuk dalam larik * viewsWithActiveTouch *) akan diberikan ke tombol, sementara setiap sentuhan pada stackview di mana pun selain tampilan ini tidak akan dicegat, dan oleh karena itu diteruskan ke apa pun yang ada di bawah tumpukan melihat.
sumber
Jika tampilan tempat Anda ingin meneruskan sentuhan tidak kebetulan merupakan subview / superview, Anda dapat menyiapkan properti kustom di subclass UIView seperti ini:
Pastikan untuk mensintesiskannya di .m Anda:
Dan kemudian sertakan yang berikut ini di salah satu metode UIResponder Anda seperti:
Di mana pun Anda membuat instance UIView, setel properti forwardableTouchee ke tampilan apa pun yang Anda inginkan untuk meneruskan acara:
sumber
Saya perlu memberikan sentuhan melalui UIStackView. UIView di dalamnya transparan, tetapi UIStackView menggunakan semua sentuhan. Ini berhasil untuk saya:
Semua diaturSubviews masih menerima sentuhan, tetapi sentuhan pada UIStackView itu sendiri pergi ke tampilan di bawah (bagi saya sebuah mapView).
sumber
Di Swift 5
sumber
Sepertinya meskipun Anda memiliki cukup banyak jawaban di sini, tidak ada yang bersih secepat yang saya butuhkan. Jadi saya mengambil jawaban dari @fresidue di sini dan mengubahnya menjadi cepat karena itulah yang sebagian besar pengembang ingin gunakan di sini sekarang.
Ini memecahkan masalah saya di mana saya memiliki beberapa bilah alat transparan dengan tombol tetapi saya ingin bilah alat tidak terlihat oleh pengguna dan acara sentuh harus dilalui.
isUserInteractionEnabled = false karena beberapa yang dinyatakan bukan merupakan opsi berdasarkan pengujian saya.
sumber
Saya memiliki beberapa label di dalam StackView dan saya tidak terlalu berhasil dengan solusi di atas, sebagai gantinya saya memecahkan masalah saya menggunakan kode di bawah ini:
Subclassing UIStackView:
Kemudian Anda dapat melakukan sesuatu seperti:
sumber
Coba sesuatu seperti ini ...
Kode di atas, dalam metode touchesBegan Anda misalnya, akan meneruskan sentuhan ke semua tampilan tampilan.
sumber
Situasi yang saya coba lakukan adalah membangun panel kontrol menggunakan kontrol di dalam UIStackView yang bersarang. Beberapa kontrol memiliki UITextField yang lain dengan UIButton. Juga, ada label untuk mengidentifikasi kontrol tersebut. Yang ingin saya lakukan adalah meletakkan tombol "tidak terlihat" besar di belakang panel kontrol sehingga jika pengguna mengetuk area di luar tombol atau bidang teks, saya kemudian dapat menangkapnya dan mengambil tindakan - terutama menutup keyboard apa pun jika ada teks bidang aktif (resignFirstResponder). Namun, mengetuk label atau area kosong lainnya di panel kontrol tidak akan melewati semuanya. Diskusi di atas sangat membantu dalam menghasilkan jawaban saya di bawah ini.
Pada dasarnya, saya mengelompokkan UIStackView dan menimpa rutin "titik (di dalam: dengan) untuk mencari jenis kontrol yang memerlukan sentuhan dan" mengabaikan "hal-hal seperti label yang ingin saya abaikan. Ia juga memeriksa di dalam UIStackView sehingga hal-hal dapat terjadi kembali ke dalam struktur panel kontrol.
Kode ini mungkin sedikit lebih bertele-tele dari yang seharusnya. Tapi itu membantu dalam debugging dan mudah-mudahan memberikan lebih banyak kejelasan tentang apa yang rutin dilakukan. Pastikan di Interface Builder untuk mengubah kelas UIStackView menjadi PassThruStack.
}
sumber
Seperti yang disarankan oleh @PixelCloudStv jika Anda ingin membuang sentuhan dari satu tampilan ke tampilan lain tetapi dengan beberapa kontrol tambahan atas proses ini - subclass UIView
// header
//penerapan
Setelah di interfaceBuilder cukup atur kelas View ke TouchView dan atur kotak aktif dengan kotak Anda. Anda juga dapat mengubah dan menerapkan logika lainnya.
sumber