Bu neden oluyor?
Bunun nedeni, alt görünümünüz süpervizörünüzün sınırları dışında kaldığında, o alt görünümde fiilen gerçekleşen dokunma olaylarının bu alt görünüme teslim edilmemesidir. Ancak, OLACAK onun Superview teslim edilmesi.
Alt görünümlerin görsel olarak kırpılıp kırpılmadığına bakılmaksızın, dokunma olayları her zaman hedef görünümün süpervizörünün sınır dikdörtgenine uyar. Diğer bir deyişle, bir görünümün denetleme görünümünün sınır dikdörtgeninin dışında kalan bir bölümünde meydana gelen dokunma olayları, bu görünüme teslim edilmez. Bağlantı
Ne yapmak gerekiyor?
Süpervizörünüz yukarıda belirtilen dokunma olayını aldığında, UIKit'e bu dokunma olayını alacak olanın benim alt görünümüm olması gerektiğini açıkça söylemeniz gerekir.
Ya kod?
Gözetiminiz sırasında uygulayın 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)
}
Büyüleyici Gotchya: "En yüksek çok küçük gözetim" e gitmelisiniz
Problem görünümünün dışarıda olduğu "en yüksek" görünüme "yukarı" gitmelisiniz.
Tipik örnek:
Konteynır görünümü C olan bir ekranınız olduğunu varsayalım. Konteynır görünümü kontrolörünün görünümü V. (Geri Çağırma V, C'nin içinde oturacak ve aynı boyutta olacaktır.) V'nin bir alt görünümü var (belki bir düğme) B. Sorun B'dir aslında V.
Ancak B'nin de C'nin dışında olduğuna dikkat edin.
Bu örnekte çözümü V'ye değil,override hitTest
aslında C'ye uygulamanız gerekiyor . V'ye uygularsanız - hiçbir şey yapmaz.