स्थिति मैं करने की कोशिश कर रहा था नेस्टेड UIStackView के अंदर नियंत्रण का उपयोग करके एक नियंत्रण कक्ष का निर्माण किया गया था। कुछ नियंत्रणों में UIBextField के अन्य UIButton के साथ थे। इसके अलावा, नियंत्रणों की पहचान करने के लिए लेबल भी थे। मैं जो करना चाहता था, उसे कंट्रोल पैनल के पीछे एक बड़ा "अदृश्य" बटन लगा दिया गया था, ताकि यदि कोई उपयोगकर्ता बटन या टेक्स्ट फ़ील्ड के बाहर किसी क्षेत्र पर टैप करता है, तो मैं उसे पकड़ सकता हूं और कार्रवाई कर सकता हूं - मुख्य रूप से किसी कीबोर्ड को खारिज कर सकता है यदि कोई पाठ फ़ील्ड सक्रिय था (resignFirstResponder)। हालांकि, नियंत्रण कक्ष में एक लेबल या अन्य रिक्त क्षेत्र पर टैप करने से चीजें गुजरती नहीं हैं। उपरोक्त चर्चाएँ नीचे मेरे उत्तर के साथ आने में सहायक थीं।
मूल रूप से, मैंने UIStackView को उप-वर्गीकृत किया और नियंत्रण के प्रकार की तलाश करने के लिए "बिंदु (अंदर: साथ) दिनचर्या को ओवरवोट किया, जिसे स्पर्श की आवश्यकता थी और लेबल की तरह" अनदेखा "चीजों को जिन्हें मैं अनदेखा करना चाहता था। यह UIStackView के अंदर के लिए भी जाँच करता है ताकि चीजें नियंत्रण कक्ष संरचना में पुनरावृत्ति कर सकें।
कोड शायद थोड़ा अधिक क्रिया है जितना कि यह होना चाहिए। लेकिन यह डिबगिंग में सहायक था और उम्मीद है कि दिनचर्या क्या कर रही है में अधिक स्पष्टता प्रदान करती है। UIStackView की PassThruStack के वर्ग को बदलने के लिए बस इंटरफ़ेस बिल्डर में सुनिश्चित करें।
class PassThruStack: UIStackView {
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
for view in self.subviews {
if !view.isHidden {
let isStack = view is UIStackView
let isButton = view is UIButton
let isText = view is UITextField
if isStack || isButton || isText {
let pointInside = view.point(inside: self.convert(point, to: view), with: event)
if pointInside {
return true
}
}
}
}
return false
}
}