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 (которая анимирует слои, а не представления).