Как отменить анимацию на основе блоков UIViews? - PullRequest
20 голосов
/ 01 ноября 2011

В настоящее время я фокусируюсь на следующей проблеме:

я запускаю анимацию, где запускаются 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 минуты закончатся?

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

Ответы [ 4 ]

32 голосов
/ 01 ноября 2011

Если вы запускаете новую анимацию, которая занимает 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 секунд, любая анимация отменит старую. Хотя не совсем уверен насчет разных типов анимации. Например, я не знаю, остановит ли изменение кадра затухание.

7 голосов
/ 15 мая 2014

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

[movingView.layer removeAllAnimations];
1 голос
/ 31 июля 2017

Настройка параметров анимации 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];
1 голос
/ 01 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...