Альфа-изменения в анимации UIView не имеют никакого эффекта, кроме анимации UIView.

Я нахожу как минимум 5 других вопросов типа «Анимация UIView не работает», и я не хочу добавлять еще один. :(. Я уверен, что это не что-то особенное для alpha. Та же проблема с backgroundColor. Так что это что-то базовое.

Это работает:

        [self.view viewWithTag:kPlayView].alpha = 0.75;
        [self.view viewWithTag:kCancelView].alpha = 0.75;
        [self.view viewWithTag:kTapViewTag].backgroundColor = [UIColor whiteColor];

Это не (ничего не делает):

 //kPlayView and kCancelView are subviews of kTapViewTag  
 [UIView animateWithDuration:2.0  animations:^{
        [self.view viewWithTag:kPlayView].alpha = 0.75;
        [self.view viewWithTag:kCancelView].alpha = 0.75;
        [self.view viewWithTag:kTapViewTag].backgroundColor = [UIColor whiteColor];

    } ];

Почему? Это вызывается в обработчике жестов для просмотра kTapViewTag. Это представление с backgorundColor = [UIColor clearColor], которое я хочу исчезнуть до белого и изменить альфа-канал подпредставлений на 0,75 в ответ на жест касания.

ОБНОВЛЕНИЕ:

Обратное работает. Это работает:

       [UIView animateWithDuration:2.0 animations:^{
          [self.view viewWithTag:kPlayView].alpha = 0;
          [self.view viewWithTag:kCancelView].alpha = 0;
          [self.view viewWithTag:kTapViewTag].backgroundColor = [UIColor clearColor];
        }];

Я могу показать представление, которое действует как «пауза / возобновление» без анимации, а затем анимировать постепенное исчезновение. Это работает взад и вперед до тех пор, пока я не пытаюсь анимировать постепенное появление.

ОБНОВЛЕНИЕ 2

Вот полная реализация для справки. Что-то здесь есть? (Я смотрел слишком много раз).

- (void)didTap:(id)selector
{

    isPaused = (isPaused) ? NO: YES;

    [self.view viewWithTag:kPlayView].userInteractionEnabled = isPaused;
    [self.view viewWithTag:kCancelView].userInteractionEnabled = isPaused;

    if (isPaused)
    {

        [self pauseLayer:self.view.layer];
        [timer1 invalidate];
        [timer2 invalidate];

       [UIView animateWithDuration:2.0  animations:^{
            [self.view viewWithTag:kPlayView].alpha = 0.75;
            [self.view viewWithTag:kCancelView].alpha = 0.75;
            [self.view viewWithTag:kTapViewTag].backgroundColor = [UIColor whiteColor];
        } ];
    }
    else
    {
        isPaused = NO;

        [UIView animateWithDuration:2.0 animations:^{
            [self.view viewWithTag:kPlayView].alpha = 0;
            [self.view viewWithTag:kCancelView].alpha = 0;
            [self.view viewWithTag:kTapViewTag].backgroundColor = [UIColor clearColor];
        }];

        [self resumeLayer:self.view.layer];
        [self animateNotification];
    }         
}

ОБНОВЛЕНИЕ 3

- (void)pauseLayer:(CALayer*)layer
{
    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
    layer.speed = 0.0;
    layer.timeOffset = pausedTime;
}

- (void)resumeLayer:(CALayer*)layer
{
    CFTimeInterval pausedTime = [layer timeOffset];
    layer.speed = 1.0;
    layer.timeOffset = 0.0;
    layer.beginTime = 0.0;
    CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    layer.beginTime = timeSincePause;
}

person ToddB    schedule 09.11.2012    source источник
comment
что происходит, когда вы запускаете блок анимации? что-нибудь вообще изменится на экране?   -  person jackslash    schedule 10.11.2012
comment
спасибо jackslash. абсолютно ничего не происходит, никаких видимых изменений. НО представление с прикрепленным UITapGestureRecognizer (kTapViewTap) больше не реагирует на нажатия. См. Обновление для получения дополнительной информации.   -  person ToddB    schedule 10.11.2012
comment
Я создал образец проекта, используя приведенную здесь информацию, но мне не удалось воспроизвести вашу проблему. Приведенный выше код работает до тех пор, пока ваши константы для тегов уникальны.   -  person jackslash    schedule 10.11.2012
comment
В любом случае, не лучше ли иметь выходы к видам? найти представление по тегу так ... хрупко   -  person jackslash    schedule 10.11.2012
comment
Еще раз спасибо, я обновил всю реализацию, а не отрывок. Я где-то упускаю большую картину. Анимация на почтовом слое приостанавливается с использованием техники Apple, которая выглядит как красный флаг, но то же самое происходит и во время второй анимации, которая работает.   -  person ToddB    schedule 10.11.2012
comment
Показать этот метод [self pauseLayer:self.view.layer];   -  person jackslash    schedule 10.11.2012


Ответы (1)


Анимации UIView - это хорошая оболочка высокого уровня для Core Animation, которая визуализирует свои анимации с использованием слоя вашего представления. Устанавливая скорость слоя на 0, вы фактически останавливаете запуск анимации uiview.

Когда вы снова запускаете слой, вы начинаете его с того места, где он остановился. Анимации до паузы и после объединяются, и ничего не происходит.

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

Я предполагаю, что вы не собираетесь приостанавливать слой вот так. Должны быть лучшие способы удаления и остановки анимации. например с UIView вы просто снова анимируете свойство, и оно останавливается, с CALayer у вас есть removeAllAnimations и removeAnimationForKey:, а также вы можете изучить использование -[CALayer presentationLayer], чтобы узнать, где конкретный слой находится на экране в определенной точке анимации, а затем настроить фактический слой значения для соответствия.

person jackslash    schedule 09.11.2012
comment
Большое спасибо! Увы, я прибег к pauseLayer: после того, как полностью застрял в своем проекте. У других способов, которыми я остановил анимацию, были проблемы. Спасибо за решение этой проблемы, к сожалению, мне может потребоваться задать другой вопрос. Еще раз спасибо. - person ToddB; 10.11.2012