Objective-CブロックがUIGestureRecognizerを停止する

ここに私の問題があります。

ブロックを使用して、画面上に2つのラベルを1つずつ表示します(1つのREADYラベルが表示されてから消え、GO!ラベルが表示されてから消えます)。

また、ユーザーがビューをドラッグしているかどうかを検出するジェスチャ認識機能もあります。

私のアプリがラベルを表示しているとき、ジェスチャ認識プログラムはコールバックの呼び出しをやめます。

ここに私のコードです:

[UIView animateWithDuration:1 animations:^{
    readyLabel.alpha = 0;
}completion:^(BOOL finished){
    [readyLabel removeFromSuperview];
    [self.view addSubview:goLabel];
    [UIView animateWithDuration:1 animations:^{
        goLabel.alpha = 0;
    }completion:^(BOOL finished){
        self.ball = [[Ball alloc] init];
        [self.view addSubview:self.ball];

        _timer = [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(moveBall:) userInfo:nil repeats:YES];
    }];
}];

私がこれまでに試したのは、NSThreadを使用してメインスレッドの外側でブロックを実行していますが、結果はありません。

私のラベル(最初のアニメーションが終了した後に1つのラベルを表示する)の問題を避けるために、 performSelector:withObject:afterDelay を使うことができました。

なぜジェスチャーレコグナイザーはコールバックを停止するのですか?ブロックはこれに責任がありますか?

1

2 答え

これは、ブロックアニメーションがユーザーの操作を無効にするためです。 options animateWithDuration:delay:options:animations:completion:を使用し、 UIViewAnimationOptionAllowUserInteraction を指定する必要があります。

5
追加された

これは、 UIView がブロックを使用してアニメーション化されている場合、UIのやり取りを妨げるからです。この動作を回避するには、 UIViewAnimationOptionAllowUserInteraction オプションを使用する必要があります。

[UIView animateWithDuration:1
                      delay:0.0
                    options:UIViewAnimationOptionAllowUserInteraction
                 animations:^{
                         readyLabel.alpha = 0;
                  }
                 completion:^(BOOL finished){
                         [UIView animateWithDuration:1
                                               delay:0.0
                                             options:UIViewAnimationOptionAllowUserInteraction
                                          animations:^{
                                              goLabel.alpha = 0;
                                           }
                                          completion:^(BOOL finished){
                                              self.ball = [[Ball alloc] init];
                                              [self.view addSubview:self.ball];

                                              _timer = [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(moveBall:) userInfo:nil repeats:YES];
                                           }
                           ];
                  }
 ];
4
追加された