そのUIView
上に4つのボタンがUIView
あり、ボタンビューの上に別のボタンがあります。一番上のビューには、UIImageView
が付いたが含まUITapGestureRecognizer
れています。
私が作成しようとしている動作は、ユーザーがタップするUIImageView
と、画面の右下隅にある小さいものとアニメーション化して大きくなるものとの間で切り替わることです。大きい場合は下のビューのボタンを無効にし、小さい場合は右下隅にある場合はタッチをボタンに渡し、通常どおりに機能させます。私はほとんどそこにいますUserInteractions
が、トップビューを無効にしない限り、タッチをボタンに渡すことができません。
私はこれを私initWithFrame:
のトップビューに持っています:
// Add a gesture recognizer to the image view
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped:)];
tapGestureRecognizer.cancelsTouchesInView = NO;
[imageView addGestureRecognizer:tapGestureRecognizer];
[tapGestureRecognizer release];
そして私はこれが私のimageTapped:
方法です:
- (void) imageTapped:(UITapGestureRecognizer *) gestureRecognizer {
// Toggle between expanding and contracting the image
if (expanded) {
[self contractAnimated:YES];
expanded = NO;
gestureRecognizer.cancelsTouchesInView = NO;
self.userInteractionEnabled = NO;
self.exclusiveTouch = NO;
}
else {
[self expandAnimated:YES];
expanded = YES;
gestureRecognizer.cancelsTouchesInView = NO;
self.userInteractionEnabled = YES;
self.exclusiveTouch = YES;
}
}
上記のコードでは、画像が大きいとボタンが非アクティブになり、画像に触れると縮小してボタンがアクティブになります。ただし、小さな画像はタッチを受けないため、拡大しません。
どちらの場合も設定self.userInteractionEnabled = YES
すると、タッチすると画像が拡大および縮小しますが、ボタンはタッチを受信せず、無効になっているように動作します。
タッチしたときに画像を拡大および縮小する方法はありますが、画像が縮小された状態の場合にのみ下のボタンがタッチを受け取るようにする方法はありますか? 私はここで愚かなことをしていて、明らかな何かを見逃していますか?
私はこれを機能させようとして絶対に怒っているので、助けていただければ幸いです。
デイブ
アップデート:
さらにテストするために、メソッドtouchesBegan:
とtouchesCancelled:
メソッドをオーバーライドし、UIImageView を含むビューでそれらのスーパー実装を呼び出しました。上記のコードでは、touchesCancelled:
は呼び出されず、touchesBegan:
は常に呼び出されます。
そのため、ビューがタッチされているように見えますが、それらは下のビューに渡されていません。
アップデート
これは、レスポンダー チェーンの仕組みによるものですか? 私のビュー階層は次のようになります。
VC - View1
-View2
-imageView1 (has tapGestureRecogniser)
-imageView2
-View3
-button1
-button2
View2 が前面にあると言うように、OS は最初に hitTest を実行するので、すべてのタッチを取得する必要があり、View2 の userInteractions が NO に設定されていない限り、これらは View3 に渡されません。これはどのように機能し、View2 がそのタッチを View3 に渡す方法はありますか?