UIButton не взаимодействует во время анимации - PullRequest
10 голосов
/ 14 июня 2011

Я пытаюсь оживить UIButton. Но во время анимации взаимодействие с UIButton отсутствует. Ожидаемое поведение - возможность нажимать на кнопку во время ее движения. Вот фрагмент кода UIB-кнопки и анимации:

UIImage *cloudImage = [UIImage imageNamed:@"sprite.png"];    
UIButton moveBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[moveBtn setFrame:CGRectMake(0.0, 80.0, cloudImage.size.width, cloudImage.size.height)];
[moveBtn setImage:cloudImage forState:UIControlStateNormal];
[moveBtn addTarget:self action:@selector(hit:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:moveBtn];
CGPoint newLeftCenter = CGPointMake( 300.0f + moveBtn.frame.size.width / 2.0f, moveBtn.center.y);
[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:5.0f];
[UIView setAnimationRepeatCount:HUGE_VALF];
moveBtn.center = newLeftCenter;
[UIView commitAnimations];

hit селектор просто отображает NSLog, чтобы показать, реагирует ли кнопка на это или нет. Любая помощь будет оценена.

Ответы [ 5 ]

26 голосов
/ 14 июня 2011

Попробуйте установить параметр анимации на UIViewAnimationOptionAllowUserInteraction.

[UIView animateWithDuration:.2
                      delay: 0
                    options: UIViewAnimationOptionAllowUserInteraction
                 animations:^{ 
                     // animation logic
                 }
                 completion:^(BOOL completed) { 
                     // completion logic
                 }
 ];
11 голосов
/ 14 июня 2011

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

РЕДАКТИРОВАТЬ:

Этот ответ - это то, что я имел в виду. Вам нужно вручную переместить кнопку с помощью NSTimer, по-видимому. См. Связанный вопрос / ответ для более.

Другие люди предлагают передать UIViewAnimationOptionAllowUserInteraction в качестве опции UIViewAnimation.

0 голосов
/ 18 января 2019

Для swift 4 этот код работает,

UIView.animate(withDuration: 2, delay: 0, options: [.autoreverse, .repeat, .allowUserInteraction],
                   animations: {
                    self.btnCashGame?.frame.origin.y -= 15



    },completion:  { (finished: Bool) in
        self.btnCashGame?.frame.origin.y += 15

    })
0 голосов
/ 12 мая 2014

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

У меня была эта проблема, и в моем случае использование UIViewAnimationOptionAllowUserInteraction не работало. Я анимировал альфа UIButton внутри UIBarButtonItem (созданного с initWithCustomView :), чтобы создать пульсирующий эффект, и эта опция не сработала. Мне также не нравится опция NSTimer (не плавная), поэтому в итоге я просто добавил кнопку наложения, которая мне не нравится, но работает без нареканий.

0 голосов
/ 02 сентября 2011

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

Итак, поскольку анимация все равно требовалась, я нашел решение, которое не требует таймера.Он анимирует только небольшое расстояние, и, таким образом, нажатие кнопки все еще является точным, с небольшой ошибкой, которая в моем случае очень незаметна в пользовательском интерфейсе, и ее можно уменьшить в зависимости от ваших параметров.ошибка в любой момент времени <15.0, которая может быть уменьшена для большей точности в зависимости от ваших требований к скорости анимации.Вы также можете уменьшить длительность для большей скорости. </p>

- (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];
                    }];

}
...