iOS: IBAction не вызывается во время анимации

В моем приложении я вызываю этот метод для перемещения UIButton

- (void) buttonMovement{

    [UIView animateWithDuration:0.8
                          delay:0.0
                        options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         // do whatever animation you want, e.g.,
                         play_bt.center = CGPointMake(play_bt.center.x, play_bt.center.y-20);
                     }
                     completion:NULL];
}

Таким образом, моя кнопка выполняла движение "вверх и вниз", но если я ее "нажму", IBAction не будет работать. Если я не делаю эту анимацию, она работает нормально. Зачем? Если эта анимация является проблемой для вызова действия, какой способ сделать анимацию, которая не доставляет мне проблем? Другой способ - переместить кнопку в виде изображения, и над ней я надел невидимую кнопку, но я потерял эффект от пресса, и он превратился в шум.

2 ответа

Решение

Обходной путь - внедрить touchesBegan вместо IBAction для кнопки анимации.

Вы можете проверить ответы, приведенные здесь: Нажав на анимационное изображение / кнопку

- (void)touchesBegan:(NSSet*) touches withEvent:(UIEvent *) event{

    // Get location of touched point
    CGPoint point = [[touches anyObject] locationInView:self.view];

    //
    // Check if point is inside your button frame
    // or compare it with the presentation layer
    //

}

Многие люди предоставляют неправильную информацию здесь. Я пытался взвесить комментарии. Теперь пришло время опубликовать окончательный ответ. Чтобы процитировать мой ответ на вопрос " нажмите на анимационное изображение / кнопку", связанный с @Radu выше:

Короткий ответ: вы не можете нажимать на виды, пока они анимируются. Причина в том, что виды на самом деле не перемещаются от начального до конечного местоположения. Вместо этого система использует "слой представления" в Core Animation для создания внешнего вида движущегося / вращающегося / масштабирующего / любого другого объекта вашего вида.

Что вам нужно сделать, это присоединить распознаватель жестов касания к содержащему представлению, которое полностью включает анимацию (возможно, весь экран), а затем написать код, который просматривает координаты касания, выполняет преобразование координат и решает, включен ли касание вид, который вам небезразличен. Если нажатие на кнопку, и вы хотите, чтобы кнопка подсвечивалась, вам нужно будет обрабатывать и эту логику.

У меня есть пример проекта на github, который показывает, как это сделать, когда вы выполняете как анимацию UIView, так и базовую анимацию с помощью CABasicAnimation (которая анимирует слои, а не представления).

Демонстрация базовой анимации с тестированием хитов

Другие вопросы по тегам