web-dev-qa-db-ja.com

iOSで親ビューのuserInteractionEnabledがNOに設定されている場合に連絡を取る方法

親ビューのuserInteractionEnabled = NOの場合、userInteractionEnabledプロパティがYESに設定されていても、そのサブビューはタッチイベントを受け入れません。

サブビューでタッチイベントを取得する方法はありますか?

41
subchap

タッチを通過させるビューを取得し、そのサブビューにタッチを処理させるには、そのビューのuserInteractionEnabledをYESにして、代わりに次のスニペットを使用します。

-(id)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    id hitView = [super hitTest:point withEvent:event];
    if (hitView == self) return nil;
    else return hitView;
}

出典: http://cocoaheads.tumblr.com/post/2130871776/ignore-touches-to-uiview-subclass-but-not-to-its

75
Nikso

親ビューのuserInteractionEnabledプロパティをNOに設定すると、そのサブビューのuserInteractionEnabledプロパティも暗黙的にNOに設定されます。あなたが説明したアプローチを使用してサブビューにタッチイベントを取得する方法はわかりませんが、ユーザーが操作するビューを単純にオーバーレイするビューを作成できますが、それらの親ではありませんビュー。

4
mblPrgr

迅速な解決策-親ビューのカスタムビュークラスを用意し、それに次のコードを追加する必要があります。親ビューのユーザーインタラクションを有効にしておいてください。

次のコードがお役に立てば幸いです。

class MyCustomParentView: UIView {    
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let hitView = super.hitTest(point, with: event)
        if hitView == self {
            return nil
        } else {
            return hitView
        }
    }
}
3
Syed Zahid Shah