Подтвердить что ты не робот

Как отменить анимацию на основе блоков UIViews?

i в настоящее время сосредоточена следующая проблема:

i запустите анимацию, в которой запускаются 2 объекта-атрибута.

код:

    [UIView animateWithDuration:0.3 animations:^{
        greyscaleImage.alpha     = 1;
        activityIndicator.alpha  = 1;
    } completion:^(BOOL f){
        if(f)
        {
            [activityIndicator startAnimating];
        }
    }];

который отлично работает.

Единственная проблема, которую я обнаружил, заключается в том, что у меня есть 0,3 секунды, чтобы свернуть приложение, когда вид, который удерживает этот ActivityIndicator и greyscaleImage, освобождается.

Чтобы сделать его более понятным, представьте себе ViewController, его представление представлено с помощью способов IOS-модального просмотра по умолчанию. Теперь запускаем эту анимацию, которая занимает 2 минуты. до достижения этих 2 минут вы обнаружите, что анимация довольно скучна, и вы хотите отклонить эту точку зрения. теперь, когда вызывается представление, activityIndicator и greyscaleImage, анимация o/c не может знать, что делать.

поэтому мне интересно, что здесь делать + почему отладчик указывает на

  } completion:^(BOOL f){

вместо, например, [activityIndicator...

Есть ли способ, позволяющий пользователю отклонить представление до истечения 2 минут?

С наилучшими пожеланиями

4b9b3361

Ответ 1

Если вы запустите новую анимацию, которая занимает 0.0 секунд и переходит в состояние, в которое вы хотите перейти, она отменяет старую и запускает новую (мгновенную) анимацию.

Пример, когда вы хотите остановить перемещение, перейдя к тому месту, где он уже находится:

[UIView animateWithDuration:0.0
                      delay:0.0
                    options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^{movingView.frame = ((CALayer *)movingView.layer.presentationLayer).frame;}
                 completion:^(BOOL finished){}
 ];

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

Примечание. Время анимации не должно быть 0.0 секунд, любая анимация отменяет старую. Однако не совсем уверен в различных типах анимаций. Например, я не знаю, прекратит ли изменение рамки фрейм.

Ответ 2

Вы можете удалить все анимации из уровня просмотров

[movingView.layer removeAllAnimations];

Ответ 3

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

Ответ 4

Настройка параметров анимации UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction работает для меня.

Используйте его следующим образом:

[UIView animateWithDuration:0.5
                          delay:0.0
         usingSpringWithDamping:0.7
          initialSpringVelocity:0
                        options:UIViewAnimationOptionAllowAnimatedContent | UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
                     animations:^{
                    // Do your stuff here, like changing the frame etc.
                    self.containerView.frame = CGRectMake(0, 100, 300, 300);
    } completion:nil];