CAAnimation с executeSelector afterDelay - PullRequest
0 голосов
/ 17 ноября 2011

Я возиться с базовым примером CAAnimation, где я просто пытаюсь заставить CALayer вращаться в подклассе UIView.Я начинаю с создания нового CALayer с красным фоном и вставки его в self.layer.Затем я создаю CAAnimation, которая должна срабатывать при изменении непрозрачности, и применяю ее к слою CALayer, после чего он вращается, как и ожидалось.

Странная вещь в том, что если я пытаюсь применить точно такую ​​же анимацию, используя executeSelector: withObject: afterDelay:, CALayer больше не анимирует, хотя его непрозрачность все еще изменяется.Еще более странно то, что если я использую executeSelector: withObject: afterDelay: для анимации self.layer, используя почти тот же код, это работает.

Есть идеи относительно того, что происходит?Вот мой код:

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        point = [[CAGradientLayer alloc] init];

        point.backgroundColor = [UIColor redColor].CGColor;
        point.bounds = CGRectMake(0.0f, 0.0f, 30.0f, 20.0f);
        point.position = CGPointMake(100.0f, 100.0f);

        [self.layer addSublayer:point];
        [point release];    

        [self performSelector:@selector(test) withObject:nil afterDelay:2];
    }
    return self;
}

-(void)test {
    [self spinLayer:point];
    // [self spinLayer:self.layer]; works here
}

-(CAAnimation*)animationForSpinning {
    CATransform3D transform;
    transform = CATransform3DMakeRotation(M_PI/2.0, 0, 0, 1.0);

    CABasicAnimation *basicAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
    basicAnimation.toValue = [NSValue valueWithCATransform3D:transform];
    basicAnimation.duration = 5;
    basicAnimation.cumulative = NO;
    basicAnimation.repeatCount = 10000;

    return basicAnimation;
}

-(void)spinLayer:(CALayer*)layer {
    CAAnimation *anim = [self animationForSpinning];
    [layer addAnimation:anim forKey:@"opacity"];
    layer.opacity = 0.6;
}

, и это мой интерфейс

@interface MyView : UIView {
    CALayer *point;
}

-(void)test;
-(void)spinLayer:(CALayer*)layer;
-(CAAnimation*)animationForSpinning;

@end

Примечание. Я создаю экземпляр этого представления с фреймом, равным [UIScreen mainScreen].applicationFrame, внутри делегата приложения.

1 Ответ

1 голос
/ 19 ноября 2011

Изменить это:

[layer addAnimation:anim forKey:@"opacity"];

в это:

[layer addAnimation:anim
             forKey:@"notOpacity!"];

Что происходит, так это то, что неявная анимация layer.opacity = 0.6 перезаписывает вашу явную анимацию. Это происходит потому, что Core Animation использует имена свойств при добавлении неявных анимаций.

(Если вы переместитесь на layer.opacity = 0.6 выше [layer addAnimation:anim forKey:@"opacity"];, оно также будет работать, но layer.opacity не будет анимировано.)

И почему это работает без задержки: потому что неявные анимации «включены», только если слой находится в дереве и был отображен.

...