[英]Disabling user interaction for subview interferes with event handling for superview?
CustomView
包含一個子視圖SubView
,該子視圖實現了點擊處理程序。 但是,對於此實現, SubView
應該忽略水龍頭,而讓CustomView
處理它們。
應該使用下面的代碼來實現此目的,但是將userInteractionEnabled
設置為false可以防止將CustomView
上的SubView
層疊到CustomView
。 如果SubView
userInteractionEnabled
設置為false, CustomView
仍接收點擊事件嗎?
Apple文檔說將userInteractionEnabled
設置為false
會導致事件被忽略,而不是視圖會吞噬事件,因此超級視圖不會接收到它們。
// CustomView class, which is a subclass of UIView
// Handle taps
let singleTap = UITapGestureRecognizer(target: self, action: #selector(doTap))
addGestureRecognizer(singleTap)
// Add SubView
view.insertSubview(SubView, atIndex: 0)
SubView.userInteractionEnabled = false
更新的代碼( doInit
是因為所謂的buttonTapped
上調用抽頭),但仍無法正常工作:
class CustomButton : UIButton, UIGestureRecognizerDelegate {
private func doInit() {
...
// Handle taps
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(buttonTapped))
tapRecognizer.delegate = self
addGestureRecognizer(tapRecognizer)
}
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}
SubView
仍將接收分接頭,但它將忽略它們,並在此停止。 如果一個視圖的userInteractionEnabled
設置為false,它將阻止用於父視圖的觸摸。
我的猜測是您想添加此手勢識別器委托:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool
這將允許您的父視圖與SubView
同時接收觸摸。
以Laynemoseley的答案為基礎,這是Apple文檔中的相關內容:
在iOS 6.0及更高版本中,默認控制動作可防止手勢識別器行為重疊。 例如,按鈕的默認操作是單擊。 如果您在按鈕的父視圖上附加了一個單擊手勢識別器,並且用戶點擊了該按鈕,則該按鈕的操作方法將接收觸摸事件,而不是手勢識別器。 這僅適用於與控件的默認操作重疊的手勢識別,其中包括:
單指單擊UIButton,UISwitch,UIStepper,UISegmentedControl和UIPageControl。 用一根手指沿與滑塊平行的方向在UISlider的旋鈕上滑動。 UISwitch的旋鈕上的單指平移手勢,平行於開關的方向。 如果您具有這些控件之一的自定義子類,並且想要更改默認操作,則將手勢識別器直接附加到控件而不是父視圖。 然后,手勢識別器首先接收觸摸事件。 與往常一樣,請務必閱讀iOS人機界面指南,以確保您的應用程序提供直觀的用戶體驗,尤其是在覆蓋標准控件的默認行為時。
似乎唯一的解決方案是覆蓋手勢識別並允許同時手勢被識別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.