Блок Objective-C останавливает UIGestureRecognizer - PullRequest
1 голос
/ 25 ноября 2011

Вот моя проблема.

Я использую блоки для отображения двух меток на экране одна за другой (появляется одна метка ГОТОВ, затем исчезает, а метка 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 для выполнения моих блоков вне основного потока, но без результата.

Я мог бы использовать performSelector:withObject:afterDelay, чтобы избежать проблемы с моими метками (отображать одну метку после завершения первой анимации), но я думаю, что она немного грязная.

Почему мой распознаватель жестов перестает вызывать его обратный вызов? Ответственны ли за это блоки?

Ответы [ 2 ]

5 голосов
/ 25 ноября 2011

Это потому, что блочная анимация отключает взаимодействие с пользователем.Вы должны использовать animateWithDuration:delay:options:animations:completion: и указать UIViewAnimationOptionAllowUserInteraction в options.

4 голосов
/ 25 ноября 2011

Это связано с тем, что при анимации UIView с использованием блоков предотвращается взаимодействие с пользовательским интерфейсом.Чтобы избежать такого поведения, вы должны использовать опцию 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];
                                           }
                           ];
                  }
 ];
...