Mengapa ini terjadi?
Ini karena jika subview Anda berada di luar batas tampilan super, peristiwa sentuh yang sebenarnya terjadi di subview tersebut tidak akan dikirimkan ke subview tersebut. Namun, AKAN dikirim ke superview-nya.
Terlepas dari apakah sub-tampilan dipotong secara visual atau tidak, peristiwa sentuh selalu mengikuti persegi panjang batas tampilan target tampilan. Dengan kata lain, peristiwa sentuh yang terjadi di bagian tampilan yang berada di luar persegi panjang batas superview tidak akan ditayangkan ke tampilan tersebut. Tautan
apa yang kamu butuhkan?
Ketika superview Anda menerima event touch yang disebutkan di atas, Anda harus memberitahu UIKit secara eksplisit bahwa subview saya yang akan menerima event touch ini.
Bagaimana dengan kodenya?
Dalam superview Anda, terapkan func hitTest(_ point: CGPoint, with event: UIEvent?)
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if isHidden || alpha == 0 || clipsToBounds { return super.hitTest(point, with: event) }
let subviewPoint = self.convert(point, to: subview)
if !subview.isHidden && subview.bounds.contains(subviewPoint) { return subview }
return super.hitTest(point, with: event)
}
Gotchya yang menarik: Anda harus pergi ke "superview tertinggi terlalu kecil"
Anda harus "naik" ke tampilan "tertinggi" di mana tampilan masalahnya ada di luar.
Contoh umum:
Katakanlah Anda memiliki layar S, dengan tampilan wadah C. Tampilan pengontrol wadah adalah V. (Ingat V akan duduk di dalam C dan menjadi ukuran yang identik.) V memiliki subview (mungkin tombol) B. B adalah masalahnya tampilan yang sebenarnya di luar V.
Tetapi perhatikan bahwa B juga berada di luar C.
Dalam contoh ini Anda harus menerapkan solusi override hitTest
pada kenyataannya untuk C, tidak V . Jika Anda menerapkannya ke V - itu tidak melakukan apa-apa.