2011-11-17 3 views
0

나는 CALayer를 UIView의 하위 클래스에서 회전 시키려고하는 기본적인 CAAnimation 예제를 사용하고 있습니다. 먼저 새로운 CALayer를 빨간색 배경으로 만들고 self.layer에 삽입합니다. 그런 다음 불투명도 변경시 트리거되어야하는 CAAnimation을 만들어 CALayer에 적용한 다음 예상대로 회전합니다.performAelector afterDelay를 사용한 CAAnimation

필자가 performSelector : withObject : afterDelay :를 사용하여 똑같은 애니메이션을 적용하려고하면 그 불투명도가 여전히 변경되지만 CALayer는 더 이상 움직이지 않습니다. 필자가 performSelector : 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

변경이이에

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

는 :

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

무슨 일 암시 애니메이션 layer.opacity = 0.6 당신에게 명시 적으로 애니메이션을 덮어 쓰기 때문이다. 이는 코어 애니메이션이 암시 적 애니메이션을 추가 할 때 속성 이름을 사용하기 때문에 발생합니다.

(당신이 또한 작동 [layer addAnimation:anim forKey:@"opacity"];layer.opacity = 0.6을 이동하지만, layer.opacity 애니메이션되지 않습니다.)

을 그리고 지체없이 작동하는 이유 : 암시 적 애니메이션 레이어 트리에있는 경우에만 "활성화"되어 있기 때문에 표시되었습니다.

+0

감사합니다. 귀하의 답변은 매우 유용했습니다. –