1

私は、チャットルーム領域をタップしてpreviewCancelButtonへのタッチを防止またはブロックする際に、キーボードを無効にするためのUITapGestureRecognizerに問題があると思います。InputFunctionView.mUITapGestureRecognizerがサブビュー内のUIButtonのタッチイベントをブロックします

BaseTemplateVC.m

- (void)addDismissKeyboardGesture { 

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard:)]; 
    tapGesture.cancelsTouchesInView = NO; 
    tapGesture.delegate = self; 
    self.view.tag = 111; 
    [self.view addGestureRecognizer:tapGesture]; 
} 

- (void) dismissKeyboard:(id)sender { 
    UITapGestureRecognizer *gesture = sender; 
    UIView *view = gesture.view; 
    NSLog(@"%ld", (long)view.tag); 
    [self.view endEditing:YES]; 
} 

ChatroomVC.m

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 

    //Disallow recognition of tap gestures in the segmented control. 
    if (([touch.view isKindOfClass:[UIButton class]])) { 
     NSLog(@"noooooooo"); 
     return NO; 
    } 
    return YES; 
    NSLog(@"yesssssss"); 
} 

:ここでは以下の私の関連するコードです

- (void)selectedSticker:(NSString *)stickerURLString { /* Sticker preview subview */ stickerPreviewView = [[UIImageView alloc] initWithFrame:CGRectMake(0, -120, FrameWidth, 120)]; stickerPreviewView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5f]; stickerPreviewView.userInteractionEnabled = YES; [self addSubview:stickerPreviewView]; [self bringSubviewToFront:stickerPreviewView]; /* Initialise previewCancelButton */ self.previewCancelButton = [UIButton buttonWithType:UIButtonTypeCustom]; self.previewCancelButton.frame = CGRectMake(Main_Screen_Width-30, SpaceForItems-120, 20, 20); [self.previewCancelButton setBackgroundImage:[UIImage imageNamed:@"btn_previewcancel.png"] forState:UIControlStateNormal]; [self.previewCancelButton setBackgroundImage:[UIImage imageNamed:@"btn_previewcancel.png"] forState:UIControlStateHighlighted]; [self.previewCancelButton addTarget:self action:@selector(cancelStickerPreviewButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview: self.previewCancelButton]; } /* Cancel sticker preview subview */ - (void)cancelStickerPreviewButtonPressed:(id)sender { NSLog(@"cancel sticker preview"); [self.previewCancelButton removeFromSuperview]; [stickerPreviewView removeFromSuperview]; } 
これで、previewCancelButtonはstickerPreviewViewの右上隅に正しく表示されますが、touchイベントを受け取ることができません。ボタンをタッチすると、コンソールに「111」と表示され、トレースバックするとaddDismissKeyboardGestureメソッドが含まれているBaseTemplateVC.mが見つかったため、この問題が発生する可能性があります。

誰かが私にいくつかの解決策を導くことができます。それは本当に感謝しています。前もって感謝します。 enter image description here

進捗状況:私はChatroomVC.mにgestureRecognizer方法を変更したをので、今ではボタンをタップジェスチャーを無視することができますが、問題は発生しませんボタンのアクションのまま。

+0

あなたはジェスチャーアクション機能でタップエリアを確認することができますし、プログラム的.sendAction' 'でボタンを押すと、それがボタン領域 – Tj3n

+0

にかどうrightaway返します@ Tj3nボタンのタップ領域を確認する方法がわかりません。あなたはコードで私を見せることができるので、私はあなたが意味することを正確に理解することができますか?ありがとう。 – SanitLee

+0

あなたはyesにバインドされたクリップをチェックして、それがあなたのボタンであることを確認してください。 –

答えて

1

私はGestureRecogniserのデリゲートメソッド内のコードの下に使用することにより、この解決策を見つけた:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    if ([touch.view isDescendantOfView:IFView.stickerPreviewView]) { 
    return NO; 
    } 
    return YES; 
} 

それはIFView.stickerPreviewViewはNOを返すことです。この場合、正確に何サブビューを指定します。またInputFunctionViewで、サブビューを追加する代わりにこれを使用する:

[self.superview addSubview:_stickerPreviewView]; 
2

これで試してみてください。うまくいくと思います。 touch.viewがボタンクラスの場合は、shouldReceiveTouchジェスチャーの代理メソッドを使用し、リターンNOを使用します。 ボタンを見つけたら、ジェスチャーを破棄してボタンアクションを実行します。ここで

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 

    // Block the recognition of tap gestures in the button. 
    if (([touch.view isKindOfClass:[UIButton class]])) { 
     return NO; 
    } 

    return YES; 
} 

デモの実装です: 私はストーリーボードのビューコントローラのメインビューにボタンをとっています。

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureClicked:)]; 
    tapGesture.delegate = self; 
    [self.view addGestureRecognizer:tapGesture]; 
} 
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 

    // Disallow recognition of tap gestures in the segmented control. 
    if (([touch.view isKindOfClass:[UIButton class]])) { 
     return NO; 
    } 
    return YES; 
} 
- (IBAction)btnTestClicked:(UIButton *)sender { 
    NSLog(@"test button click"); 
} 

- (void)tapGestureClicked:(UIGestureRecognizer *)recog 
{ 
    NSLog(@"tap gesture clicked"); 
} 

希望します。 コーディングハッピー...

+0

実際には元のジェスチャーを破棄したくないのですが、stickerPreviewViewサブビューのpreviewCancelButtonにタッチ認識を追加するだけです。 – SanitLee

+0

それはあなたが望むようにするでしょう。ボタンをクリックすると、いいえをジェスチャーに戻します。その結果、ジェスチャーアクションは起動されず、ボタンアクションが発生します。ジェスチャーエリア内のボタン以外のときは、ジェスチャーメソッドを呼び出します。 – Janmenjaya

+0

既存のコードにコードを配置する場所はどこですか?私に同行してください。私はとても初心者です。ありがとうございました。 – SanitLee

関連する問題