SetAnimationBeginsFromCurrentState = YES не работает в iOS 5 или на iPad? - PullRequest
1 голос
/ 04 декабря 2011

Мои анимации не воспринимаются из текущего состояния во время полета, когда другой стартует, даже если все мои блоки анимации настроены на:

setAnimationBeginsFromCurrentState=YES

То же самое относится и к блочной анимации (новый метод с iOS 4) с установленной опцией UIViewAnimationOptionBeginFromCurrentState.

На всех моих старых устройствах это работает отлично. На iOS 5 и iPad Simulator это не так. Есть ли обходной путь?

(Примечание. Кажется, он работает на всех протестированных устройствах. Только не на симуляторе.)

Вот пример, который не работает в симуляторе iPad 4.3 или 5.0:

[UIView animateWithDuration:0.5 
                      delay:1.0f 
                    options:UIViewAnimationOptionCurveEaseIn | UIViewAnimationOptionBeginFromCurrentState | 
 UIViewAnimationOptionOverrideInheritedDuration | UIViewAnimationOptionOverrideInheritedCurve 
                 animations:^{
                     self.layer.transform = CATransform3DScale(CATransform3DIdentity, 0.5f, 0.5f, 1.0f);
                 }  
                 completion:^(BOOL finished) {
                    [self performSelector:@selector(finishedScaling)];
                 }];

Другая анимация начинает устанавливать масштаб преобразования на 0,1, 0,1 (= очень маленький). Во время полета эта анимация срабатывает и пытается вернуть ее к 0,5, 0,5. При включении ранее запущенная анимация неожиданно заканчивается 0,1, 0,1 (= очень мало). Затем масштабируется от 0,1 до 0,5. Не должно случиться Может быть, плохая комбинация вариантов?

Ответы [ 2 ]

2 голосов
/ 13 декабря 2011

Вы говорите self.layer.transform = в блоке просмотра анимации. Блок анимации вида предназначен для анимации вида . Вы делаете это, устанавливая свойства анимации представления, а не свойства анимации слоя.

Кроме того, если self является представлением, то self.layer.transform не является неявно анимируемым. Вы не можете неявно анимировать (то есть, установив свойство) нижележащий слой представления. Слой всегда будет просто переходить к новому значению, когда вы говорите self.layer.transform =.

Таким образом, решение состоит в том, чтобы сказать self.transform = (если self является представлением), или же вообще не использовать блочную анимацию - используйте Core Animation (например, CABasicAnimation) для анимации слоя.

0 голосов
/ 05 декабря 2011

Вот пример, который работает:

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:1];
        CGPoint p = v.center;
        p.x += 100;
        v.center = p;
        [UIView commitAnimations];

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationDuration:1];
        CGPoint p2 = v.center;
        p2.y = 0; // and try changing x to y
        v.center = p2;
        [UIView commitAnimations];

При setAnimationBeginsFromCurrentState:YES две анимации работают вместе, изменяя положение x и y вида вместе.Без этого первая анимация выражается в виде «прыжка» вправо перед началом второй анимации.Так что я бы сказал, что setAnimationBeginsFromCurrentState:YES все еще делает свою работу правильно.На симуляторе iPad он работает так же, как и везде.Итак, есть контрпример.

Можете ли вы, по запросу другого комментария, отобразить код, который не работает?(Вы показали пример кода для второй анимации, но не для первой анимации, поэтому невозможно выполнить тестирование.)

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