1つのviewControllerに1つのmainViewがあり、そのビューに別のビュー(フレーム0,0,86,420を持つsidePanelビューとして知られています)があります。tapGestureを追加しました。ここで、sidePanelView以外のmainViewに対してのみジェスチャ認識を有効にします。下の画像を参照してください
sidePanelViewのtapGestureを無効にし、それ以外の領域を有効にしたい。どうやるか。 (sidePanelView以外の領域で言いたいのはsidePanelViewのparentViewです)。
私はこれをしました
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
タッチポイントの場所を確認しました。タッチの場所に応じて、次のように作業しました。
if(points.x>86)
{//hide the side panel
}
イベントと同期してジェスチャを認識します。
それが正しいので、あなたはバラタの答えを受け入れるべきです。私はあなたがそれをどのように行うかを説明したいだけです:
ビューコントローラをUIGestureRecognizerDelegate
に準拠するように定義します。例:
@interface ViewController () <UIGestureRecognizerDelegate>
// the rest of your interface
@end
ジェスチャーにdelegate
を設定していることを確認してください。
UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleMainTap:)];
gesture.delegate = self;
[self.view addGestureRecognizer:gesture];
次に、問題のビューに対してタッチが行われるかどうかを確認します。
- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if (CGRectContainsPoint(self.menuView.bounds, [touch locationInView:self.menuView]))
return NO;
return YES;
}
UIGestureRecognizerDelegateのgestureRecognizer:shouldReceiveTouch:メソッドを使用して、タッチが発生した場所を確認し、ジェスチャに応答するかどうかを決定できます。タッチがビューの端(tiを無効にする場所)に近すぎる場合はNOを返し、そうでない場合はYESを返します。または、touch.viewをチェックして、UIImageViewでタッチが発生したかどうかを確認します。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldReceiveTouch:(UITouch *)touch;
Swift 3バージョン:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if theView.bounds.contains(touch.location(in: theView)) {
return false
}
return true
}
同様の問題に遭遇しました。 @Robからの回答を使用することになりました。これがSwiftバージョン:
extension ViewController: UIGestureRecognizerDelegate {
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
return !CGRectContainsPoint(menuView.bounds, touch.locationInView(menuView))
}
}
特定のビューに対してUITapGestureRecognizer
を無効にする場合は、userInteractionを削除するだけです。
例
sidePanel.userInteractionEnabled = NO;