1

編集:UIPageViewControllerの「データソース」である複数のViewControllerの上部に配置されたUIViewにこのメソッドがあります

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setBackgroundColor:[UIColor clearColor]];

        UITapGestureRecognizer *tapGR =[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTap:)];
        [tapGR setDelegate:self];
        [tapGR setNumberOfTapsRequired:1];
        [self addGestureRecognizer:tapGR];


        UITapGestureRecognizer *doubleTapGR = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleDoubleTap:)];
        [doubleTapGR setNumberOfTapsRequired:2];
        [self addGestureRecognizer:doubleTapGR];

        [tapGR requireGestureRecognizerToFail :doubleTapGR];

        [tapGR release];
        [doubleTapGR release];
    }
    return self;
}

-(void)handleTap:(UITapGestureRecognizer *)tapRecognizer{
    if (!(tapRecognizer.state == UIGestureRecognizerStatePossible)) {
        [[NSNotificationCenter defaultCenter]postNotification:[NSNotification notificationWithName:kTapOnCenterNotificationName object:nil]];
    }
}

-(void)handleDoubleTap:(UITapGestureRecognizer *)doubleTapRecognizer{

    CGPoint point = [doubleTapRecognizer locationInView:self];

    LSSharedVariables *sharedVariables = [LSSharedVariables sharedInstance];
    [sharedVariables setDoubleTapPoint:point];

    [[NSNotificationCenter defaultCenter]postNotification:[NSNotification notificationWithName:kLongPressNotificationName object:nil]];

}

ジェスチャレコグナイザーの状態がUIGestureRecognizerStateEndedと等しい場合にのみアクションを実行するように指定した場合でも、ログは複数回表示されます。このブロックでアクションを1回だけ実行したいのですが、どうすればよいですか?

編集:ダブルタップメソッドは、UIPageViewControllerのページの何倍も呼び出されることがわかりました。私が理解できないのは、なぜそれがsingleTapGestureRecognizerと同じではないのかということです。

4

2 に答える 2

1
- (void) handleDoubleTap : (UIGestureRecognizer*) sender
{
NSLog (@"Double tap is being handled here");
}

- (void) handleSingleTap : (UIGestureRecognizer*) sender
{
NSLog (@"Single tap is being handled here");
}

- (void) loadView
{
UITapGestureRecognizer* doubleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleDoubleTap];
UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleSingleTap];

[singleTap requireGestureRecognizerToFail : doubleTap];

[doubleTap setDelaysTouchesBegan : YES];
[singleTap setDelaysTouchesBegan : YES];

[doubleTap setNumberOfTapsRequired : 2];
[singleTap setNumberOfTapsRequired : 1];

[self.view addGestureRecognizer : doubleTap];
[self.view addGestureRecognizer : singleTap];

[singleTap release];
[doubleTap release];
}

これを試して

于 2012-06-18T16:20:02.243 に答える
0

複数のオブジェクトがタッチをリッスンしていて、それが発生したときにすべてが個別に「handleDoubleTap」を呼び出しているように思えます。これにより、ダブルタップ イベントが発生したときに複数回呼び出される理由が説明されます。

発生している動作はタッチイベントの標準的な動作ではないため、コードを検索して複数回追加していないことを確認することから始めます。

于 2012-06-19T15:58:05.987 に答える