ऐसा क्यों हो रहा है?
ऐसा इसलिए होता है क्योंकि जब आपका सबव्यू आपके सुपरवाइज की सीमा के बाहर होता है, तो उस सबव्यू पर होने वाली घटनाओं को स्पर्श करें, जो कि सबव्यू उस सबव्यू में नहीं पहुंचेगा। हालांकि, यह होगा अपने superview को वितरित किया।
भले ही साक्षात्कारों को नेत्रहीन रूप से क्लिप किया गया हो या नहीं, स्पर्श घटनाएं हमेशा लक्ष्य दृश्य के पर्यवेक्षण की आयत का सम्मान करती हैं। दूसरे शब्दों में, एक दृश्य के एक हिस्से में होने वाली घटनाओं को स्पर्श करें जो इसके पर्यवेक्षण के सीमा आयत के बाहर स्थित है जो उस दृश्य तक नहीं पहुंचाई गई है। संपर्क
आपको क्या करने की आवश्यकता है?
जब आपके पर्यवेक्षक को ऊपर बताई गई टच ईवेंट प्राप्त होती है, तो आपको स्पष्ट रूप से UIKit को बताना होगा कि मेरा सबव्यू इस टच ईवेंट को प्राप्त करने वाला होना चाहिए।
कोड के बारे में क्या?
अपने पर्यवेक्षण में, कार्यान्वित करें 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) }
// convert the point into subview's coordinate system
let subviewPoint = self.convert(point, to: subview)
// if the converted point lies in subview's bound, tell UIKit that subview should be the one that receives this event
if !subview.isHidden && subview.bounds.contains(subviewPoint) { return subview }
return super.hitTest(point, with: event)
}
आकर्षक गोटिया: आपको "उच्चतम-छोटे सुपरवाइवे" पर जाना चाहिए
आपको "ऊपर" जाना होगा "उच्चतम" दृश्य पर जो समस्या का दृश्य बाहर है।
विशिष्ट उदाहरण:
मान लें कि आपके पास एक स्क्रीन S है, जिसमें कंटेनर दृश्य C. कंटेनर दृश्य-नियंत्रक का दृश्य V है (रिकॉल V, C के अंदर बैठेगा और समान आकार का होगा।) V का एक सबव्यू (शायद एक बटन) B. B समस्या है। दृश्य जो वास्तव में वी के बाहर है।
लेकिन ध्यान दें कि B, C के बाहर भी है।
इस उदाहरण में आपको समाधान override hitTest
को वास्तव में C पर लागू करना है, V से नहीं । यदि आप इसे V पर लागू करते हैं - तो यह कुछ भी नहीं करता है।