UIViewsの下にあるタッチを通過させる
質問
私は
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
を設定すると、画像はタッチすると拡大・縮小しますが、ボタンはタッチを受けず、無効のように動作します。
画像がタッチされたときに拡大および縮小し、画像が縮小状態にある場合にのみ、その下のボタンがタッチを受け取るようにする方法はありますか? 私はここで何か愚かなことをしており、明白な何かを見逃していませんか?
私はこれを動作させるために絶対に狂いそうなので、どんな助けも感謝されます。
デイブ
UPDATEです。
さらにテストするために、私は
touchesBegan:
と
touchesCancelled:
メソッドを作成し、UIImageView を含むビューでそれらのスーパー実装を呼び出します。 上記のコードで
touchesCancelled:
は決して呼び出されず
touchesBegan:
は常に呼び出されます。
つまり、ビューがタッチを取得しているように見えますが、その下のビューに渡されていないだけなのです。
UPDATE
これはレスポンダチェーンの仕組みが原因でしょうか? 私のビューの階層はこのようになっています。
VC - View1
-View2
-imageView1 (has tapGestureRecogniser)
-imageView2
-View3
-button1
-button2
OSが最初にhitTestを行い、View2が前面にあるためすべてのタッチを取得するはずで、userInteractionsがView2に対してNOに設定されていない限り、これらはView3へ渡されることはなく、その場合imageView1もタッチを受信できないようになると考えています。 このように動作するのでしょうか?また、View2がView3にタッチを渡す方法はあるのでしょうか?
どのように解決するのですか?
UIGestureRecognizerは赤信号だと思います。 最終的には
pointInside:withEvent:
メソッドをオーバーライドしました。
UIView:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
BOOL pointInside = NO;
if (CGRectContainsPoint(imageView.frame, point) || expanded) pointInside = YES;
return pointInside;
}
これは、imageViewのどちらかをタッチするか、その拡張フラグが設定されている場合、ビューがすべてのタッチをトラップするようにします。 拡張されていない場合は、タッチがimageView上にある場合のみトラップします。
NOを返すことによって、トップレベルのVCのViewは、ヒットを探してそのビュー階層の残りの部分にクエリを実行します。
関連
-
[解決済み] UITextViewのキーボードをリターンキーで解除するには?
-
[解決済み] iOSでHTMLをNSAttributedStringに変換する
-
[解決済み] UIButton: 選択されたハイライト状態の画像を設定する
-
[解決済み] UIImageのアスペクト比と幅を維持したリサイズ
-
[解決済み] iOSアプリでターゲットのバージョン/ビルド番号をプログラム的に表示するには?
-
[解決済み] Xcodeで非推奨の警告を抑制する
-
[解決済み] UIImageViewのコーナー半径の設定がうまくいかない
-
[解決済み] position: iPadとiPhoneで固定が効かない。
-
[解決済み] CALayersを使ったUIViewの丸め方 - 角の一部だけ - How?
-
[解決済み] 別のUIViewの下にあるUIViewとのインタラクションを許可する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] UILongPressGestureRecognizerが押し下げ時に2回呼び出される
-
[解決済み] モバイルSafari(iPhone)でテキストエリアのインナーシャドウを除去する
-
[解決済み] Xcode 4.2 - '...' の宣言は、この関数の外では表示されません 警告
-
[解決済み] レビュー待ちの状態でバイナリを拒否する(バイナリ拒否ボタンが見つからない)
-
[解決済み] iPhoneでMonoTouchは禁止になったのか?[クローズド]
-
[解決済み] ITunesのレビューURLとiOS 7(ユーザーにアプリを評価してもらう)AppStoreに空白のページが表示される。
-
[解決済み] iPhoneのSafariで<body>に適用したoverflow:hiddenは機能するのか?
-
[解決済み] iOSアプリをクラッシュさせる確実な方法とは?
-
[解決済み] Objective-Cのプロトコルでプロパティを含むものはどう扱えばいいのか?
-
[解決済み] UILabelがラベルサイズに合うようにテキストを自動縮小しない