0

ビュー コントローラーに UIView があり、その上に多数のサブビュー (ほとんどが UIButton) があり、ユーザーが UIView の外側をタップすると、コードを実行できるようにそれを検出する必要があります。この UIView は、メイン ビュー コントローラーのビューのサブビューです。

StackOverflow に関する多くの回答は、ビュー コントローラー全体をカバーする透明な UIButton を作成し、その上に UIView を追加し、UIButton がタップされたことを検出することを示しています。

私には少しハックに思えますが、間違っているかもしれません。残念ながら、将来のリリースで Apple がそれを作成する可能性があるため、透明なオブジェクトなどと対話することはできず、ソリューションが機能しなくなります。

これは本当に最善の解決策ですか?または、よりクリーンになる別の方法はありますか?

4

4 に答える 4

1

ビューコントローラーのuiviewの名前がview1であると仮定します

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint p = [touch locationInView:view1];


    if (!CGRectContainsPoint(view1.frame, p)) {//when touched out of view1
       //do action
    }   
}
于 2013-05-28T12:58:25.180 に答える
1

はい、ボタンを追加するのは良い解決策ではありません。このための特別なクラスがあります: TapGesture

于 2013-05-27T17:10:43.433 に答える
0

透明なボタンは実際には悪い解決策ではありません。ただし、別のソリューションを使用する必要がある場合は、メソッドを使用できます- (void) touchesBegan:withEvent:。これは で定義されておりUIResponder、 と の両方UIViewControllerからUIView継承されます。このメソッドは、現在のオブジェクトより前のレスポンダー チェーン内のオブジェクトによってタッチが処理されない場合に常に呼び出されます。これは、タッチがボタン上にあった場合は呼び出されないことを意味します。

最初のパラメーターは、NSSetオブジェクトのUITouchです。UITouchのメソッドを使用- (CGPoint)locationInView:(UIView *)viewして、その特定のサブビューから正確な場所を伝えることができます。返されたポイントである位置がビューの境界外にある場合は、適切なコードを実行できます。

于 2013-05-27T17:09:38.253 に答える