Masalah saya: Saya memiliki superview EditView
yang pada dasarnya menempati seluruh bingkai aplikasi, dan subview MenuView
yang hanya menempati bagian bawah ~ 20%, dan kemudian MenuView
berisi subviewnya sendiri ButtonView
yang sebenarnya berada di luar MenuView
batas (seperti ini ButtonView.frame.origin.y = -100
:).
(catatan: EditView
memiliki subview lain yang bukan bagian dari MenuView
hierarki tampilan, tetapi dapat mempengaruhi jawabannya.)
Anda mungkin sudah tahu masalahnya: kapan ButtonView
berada dalam batas-batas MenuView
(atau, lebih khusus lagi, ketika sentuhan saya berada dalam MenuView
batas-batas), ButtonView
menanggapi peristiwa sentuh. Saat sentuhan saya berada di luar MenuView
batas (namun masih dalam ButtonView
batas), tidak ada peristiwa sentuhan yang diterima oleh ButtonView
.
Contoh:
- (E) adalah
EditView
, induk dari semua tampilan - (M) adalah
MenuView
, subview dari EditView - (B) adalah
ButtonView
, subview dari MenuView
Diagram:
+------------------------------+
|E |
| |
| |
| |
| |
|+-----+ |
||B | |
|+-----+ |
|+----------------------------+|
||M ||
|| ||
|+----------------------------+|
+------------------------------+
Karena (B) berada di luar bingkai (M), ketukan di wilayah (B) tidak akan pernah dikirim ke (M) - faktanya, (M) tidak pernah menganalisis sentuhan dalam kasus ini, dan sentuhan dikirim ke objek berikutnya dalam hierarki.
Sasaran: Saya menyimpulkan bahwa penimpaan hitTest:withEvent:
dapat menyelesaikan masalah ini, tetapi saya tidak mengerti persis bagaimana caranya. Dalam kasus saya, harus hitTest:withEvent:
diganti di EditView
(superview 'master' saya)? Atau haruskah diganti MenuView
, tampilan langsung tombol yang tidak menerima sentuhan? Atau apakah saya memikirkan hal ini dengan tidak benar?
Jika ini membutuhkan penjelasan yang panjang, sumber online yang bagus akan membantu - kecuali dokumen UIView Apple, yang belum menjelaskannya kepada saya.
Terima kasih!
sumber
Oke, saya melakukan penggalian dan pengujian, berikut cara
hitTest:withEvent
kerjanya - setidaknya pada level tinggi. Gambar skenario ini:Diagram:
Karena (B) berada di luar bingkai (M), ketukan di wilayah (B) tidak akan pernah dikirim ke (M) - faktanya, (M) tidak pernah menganalisis sentuhan dalam kasus ini, dan sentuhan dikirim ke objek berikutnya dalam hierarki.
Namun, jika Anda mengimplementasikan
hitTest:withEvent:
di (M), tap di mana saja dalam aplikasi akan dikirim ke (M) (atau setidaknya ia tahu tentang mereka). Anda dapat menulis kode untuk menangani sentuhan dalam kasus itu dan mengembalikan objek yang seharusnya menerima sentuhan tersebut.Lebih khusus lagi: tujuannya
hitTest:withEvent:
adalah mengembalikan objek yang seharusnya menerima pukulan. Jadi, di (M) Anda mungkin menulis kode seperti ini:Saya masih sangat baru dalam metode ini dan masalah ini, jadi jika ada cara yang lebih efisien atau benar untuk menulis kode, silakan beri komentar.
Saya harap itu membantu siapa pun yang menjawab pertanyaan ini nanti. :)
sumber
Di Swift 5
sumber
Yang akan saya lakukan adalah membuat ButtonView dan MenuView berada pada level yang sama dalam hierarki tampilan dengan menempatkan keduanya dalam wadah yang bingkainya benar-benar sesuai dengan keduanya. Dengan cara ini, wilayah interaktif dari item yang terpotong tidak akan diabaikan karena itu adalah batas tampilan super.
sumber
Jika Anda memiliki banyak subview lain di dalam tampilan induk Anda, maka mungkin sebagian besar tampilan interaktif lainnya tidak akan berfungsi jika Anda menggunakan solusi di atas, dalam hal ini Anda dapat menggunakan sesuatu seperti ini (Di Swift 3.2):
sumber
Jika ada yang membutuhkannya, berikut adalah alternatif cepat
sumber
Tempatkan di bawah baris kode ke dalam hierarki tampilan Anda:
Untuk lebih jelasnya dijelaskan di blog saya: "goaheadwithiphonetech" mengenai "Custom callout: Button is not clickable issue".
Saya harap itu membantu Anda ... !!!
sumber