2010-06-03 5 views
7

У меня проблема с кнопками и анимацией. В принципе, я анимирую представление, используя анимацию UIView, а также пытаюсь прослушивать нажатия на кнопку внутри представления. Вид такой же большой, как и кнопка, и представление на самом деле является подклассом UIImageView с изображением под кнопкой. Представление представляет собой представление в представлении контейнера, размещенном в Interface Builder, с включенным взаимодействием с пользователем и отключением отсечения. Вся обработка анимации и кнопок выполняется в этом подклассе UIImageView, а сообщение startFloating отправляется из отдельного класса по мере необходимости.iPhone UIView Animation отключает UIButton Subview

Если я не делаю анимации, сообщение buttonTapped: отправляется правильно, но во время анимации он не отправляется. Я также пробовал реализовать метод touchesEnded, и такое же поведение происходит.

UIImageView подкласс инициализация (я кнопка заполнен цветом, так что я могу видеть кадр получает установлены правильно, что он делает):

- (id)initWithImage:(UIImage *)image { 
    self = [super initWithImage:image]; 
    if (self != nil) { 
     // ...stuffs 

     UIButton *tapBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
     tapBtn.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); 
     [tapBtn addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside]; 
     tapBtn.backgroundColor = [UIColor cyanColor]; 
     [self addSubview:tapBtn]; 

     self.userInteractionEnabled = YES; 
    } 
    return self; 
} 
метод

анимации, который запускает анимацию (если я не Назовем это кнопка работает правильно):

- (void)startFloating { 
    [UIView beginAnimations:@"floating" context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
    [UIView setAnimationDuration:10.0f]; 
    self.frame = CGRectMake(self.frame.origin.x, -self.frame.size.height, self.frame.size.width, self.frame.size.height); 
    [UIView commitAnimations]; 
} 

Таким образом, чтобы быть ясно:

  • Использование UIView анимации эффективно отключает кнопку.
  • Отключение анимации заставляет кнопку работать.
  • Кнопка имеет правильный размер и расположение на экране и правильно перемещается вместе с изображением.

ответ

7

Анимация - это просто глазная конфета. Анимация отстает от фактического движения представления. Кнопка уже находится в точке назначения, когда начинается анимация. Вы просто видите фильм с перемещением вида/кнопки.

Если вы хотите, чтобы во время анимации была нажата кнопка, вам нужно сделать анимацию самостоятельно.

+0

Хм после делать некоторые тесты, я считаю, что вы правильно. Это кажется довольно жутким, хотя и против ожиданий анимации. Когда вы говорите «сделать анимацию самостоятельно», вы имеете в виду анимацию стиля NSTimer? Кроме того, я предполагаю, что реализация тросов семейства методов проявит такое же поведение? – bensnider

+0

Итак, да, используя анимацию NSTimer, я могу использовать кнопку таким образом. Благодарю. – bensnider

+0

Вы также можете совершать касание самостоятельно и не полагаться на кнопку вообще. Это все равно потребует некоторой ручной анимации, но может дать вам лучшие результаты для взаимодействия. – axiixc

5

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

Итак, поскольку анимация потребовалась в любом случае, я нашел решение, которое не требует таймера. Он оживляет только небольшое расстояние, и, таким образом, нажатие кнопки по-прежнему является точным, и только небольшая ошибка, которая является моим случаем, очень незаметна в пользовательском интерфейсе и может быть уменьшена в зависимости от ваших параметров.

Примечание ниже, что ошибка в любой момент времени составляет < 15,0, что может быть уменьшено для большей точности в зависимости от требований к скорости анимации. Вы также можете уменьшить время продолжительности для большей скорости.

- (void)conveyComplete:(UIView*)v 
{ 
    [self convey:v delay:0]; 
} 

- (void)convey:(UIView*)v delay:(int)nDelay 
{ 
    [UIView animateWithDuration:.5 
          delay:nDelay 
         options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction) 
        animations:^
        { 
         CGRect rPos = v.frame; 
         rPos.origin.x -= 15.0; 
         v.frame = rPos; 
        } 
        completion: ^(BOOL finished) 
        { 
         [self conveyComplete:v]; 
        }]; 

} 
20

Это решает проблему:

[UIView animateWithDuration:20 delay: 0.0 options: UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction 
    ... 
+1

'UIViewAnimationOptionAllowUserInteraction' - это то, что мне нужно. Благодаря! – buildsucceeded

Смежные вопросы