2017-10-13 13 views
0

指定されたビューの境界線の外側のタッチを扱う際に上記の質問を満たしています。私はウェブサイト上で見つけるソリューションhitTestを上書きするために私に語った。イベント:このような方法:なぜsuperのhitTestを呼び出しても無限ループは発生しませんか?

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
UIView *view = [super hitTest:point withEvent:event]; 
if (view == nil) { 
    for (UIView *subView in self.subviews) { 
     CGPoint tp = [subView convertPoint:point fromView:self]; 
     if (CGRectContainsPoint(subView.bounds, tp)) { 
      view = subView; 
     } 
    } 
} 
return view; 

}

私は最初の行に著者が[super hitTest:point withEvent:event]を呼び出すことに気づいた、と私も承知していますヒットテストは再帰的です。したがって、スーパーはサブビューのhitTestメソッドを呼び出す必要があり、後者はスーパーを再度呼び出すことになります。私はなぜそれが無限ループを引き起こさないのだろうか?ありがとう!

+0

同様に、viewDidLoad()が無限ループを引き起こさない方法です。 –

+0

サブ**ビュー**とサブ**クラス**を混在していませんか? –

+0

ありがとうございます。私はその点を誤解している。私はスーパーとスーパービューをシンプルに混在させました。申し訳ありません。 – Stephen

答えて

0

あなたが間違って理解している、スーパーはサブビューでhitTestメソッドを呼び出さないので、pointInsideメソッドを呼び出します。 documentationから:withEvent:

この方法は pointInsideを呼び出すことによって、ビューの階層を横断する各サブビューの方法は サブビューがタッチイベントを受信すべきかを決定します。

希望すると助かります!

関連する問題