Yapmaya çalıştığım durum, iç içe UIStackView'ın içindeki denetimleri kullanarak bir kontrol paneli oluşturmaktı. Bazı kontroller UITextField'ın UIButton'la diğerlerine sahipti. Ayrıca, kontrolleri tanımlayan etiketler de vardı. Yapmak istediğim şey, kontrol panelinin arkasına büyük bir "görünmez" düğme koymaktı, böylece bir kullanıcı bir düğmenin veya metin alanının dışındaki bir alana dokunduysa, bunu yakalayabilir ve harekete geçebilirim - bir metin varsa öncelikle herhangi bir klavyeyi devre dışı bırakabilirim alanı etkinti (resignFirstResponder). Bununla birlikte, kontrol panelindeki bir etikete veya başka bir boş alana dokunmak hiçbir şey yapmaz. Yukarıdaki tartışmalar aşağıdaki cevabımı bulmakta yardımcı oldu.
Temel olarak, UIStackView alt sınıf ve ben dokunma ihtiyacı ve yoksaymak istediğim etiketler gibi şeyleri "yoksay" kontrol türünü aramak için "nokta (içinde: ile) rutin üzerine yazdım. Ayrıca, UIStackView'ın içini kontrol eder, böylece her şey kontrol paneli yapısına geri dönebilir.
Kod belki olması gerekenden biraz daha ayrıntılıdır. Ancak hata ayıklamada yardımcı oldu ve umarım rutinin ne yaptığı konusunda daha fazla netlik sağlar. Arabirim Oluşturucu'da, UIStackView öğelerinin sınıfını PassThruStack olarak değiştirdiğinizden emin olun.
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
}
}