2010-07-03 4 views
2

기존 레이어 속성 위치를 기준으로 추상 레이어 속성 인 angle을 정의하려고합니다. 기본적으로 원의 중심에서 레이어의 방향을 설명합니다. 내가 좋아했던 다음 내가 수동으로 setAngle에 값을 설정할 때 잘 작동 :,하지만 문제는 내가 CABasicAnimation으로 애니메이션을하려고하면 MenuItemLayer에 의해 유지 뷰 아무튼이다사용자 정의 CALayer 속성에 애니메이션 적용

@interface MenuItemLayer : CALayer 
    @property CGFloat angle; 
@end 

@implementation MenuItemLayer 

+ (BOOL)needsDisplayForKey: (NSString*)key { 
    if ([key isEqualToString: @"angle"]) return YES; 
    return [super needsDisplayForKey: key]; 
} 

- (void)drawInContext: (CGContextRef)context { 
    [self renderInContext: context]; 
} 

- (CGFloat)angle { 
    CGPoint center = self.superlayer.center; 
    CGPoint pos = self.position; 
    return atan2f(pos.x - center.x, center.y - pos.y); 
} 

- (void)setAngle: (CGFloat)angle { 
    CGPoint center = self.superlayer.center; 
    CGFloat radius = 100; 
    [CATransaction begin]; 
    [CATransaction setDisableActions: YES]; 
    self.position = CGPointMake(center.x + radius * sinf(angle), 
           center.y - radius * cosf(angle)); 
    [CATransaction commit]; 
} 

@end 


전혀 움직이지 않고 원래 위치에 머물면서 setValue :와 drawInContext :가 애니메이션의 진행 과정과 함께 정상적으로 호출되므로 프리젠 테이션 레이어의 position 속성이 업데이트됩니다.

누구나 단서가 있습니까? 감사! 항상 렌더링하기 위해 모델 층을 사용합니다 :이 renderInContext는 것을 뜻

 
renderInContext:
This method renders directly from the layer tree, ignoring any animations added to the render tree. Renders in the coordinate space of the layer.


: ----



는 그냥 문서에 다음과 같은 코멘트를 발견 drawInContext : 메소드의 수신자가 프리젠 테이션 레이어 인 우리의 경우에도 이미지? 이것이 문제의 원인이 될 수 있습니까? 그렇다면 항상 프리젠 테이션 레이어가 나타내는 올바른 위치로 레이어를 수동으로 변환해야합니까?

답변

0

무엇을 할 계획입니까?

- (void)drawInContext: (CGContextRef)context { 
    [self renderInContext: context]; 
} 

댓글을 달면 어떻게됩니까? 나는 -renderInContext가 이미지로 저장하기 위해 컨텍스트로 렌더링하는 데 가장 일반적으로 사용되므로이 이미지가 이상하다고 생각합니다. 기본 애니메이션은 문제없이 속성을 애니메이션화 할 수 있어야하지만 -drawInContext를 재정의하면 CG로 사용자 지정 그리기를 수행하려는 경우에만 의미가있는 것처럼 보입니다.

+0

답변 해 주셔서 감사합니다. drawInContext :를 제거하면 아무 것도 그려지지 않습니다. 자연스러운 이유는 needsDisplayForKey 메커니즘을 사용하여 CA 프레임 워크에 내 레이어를 다시 그려야한다는 것을 알리기 때문입니다. renderInContext로하려는 것은 애니메이션 속성 값으로 레이어를 다시 그리는 것입니다. – Kay

+0

답을 업데이트하고 CABasicAnimation 코드를 보여줄 수 있습니까? 위치에 애니메이션 효과를주기 위해 각도 맞춤 속성을 변경하려고하십니까? 저기 두 가지 문제가 있습니다. 하나는 동작을 비활성화하여 위치 변경이 생기지 않도록하는 것입니다. 둘째, 두 개의 속성 (하나의 맞춤, 각도 및 한 위치)을 애니메이션화하려면 두 개의 개별 애니메이션과 애니메이션 그룹을 사용하는 것이 좋습니다. 나는 각도 변화를 기반으로 변화하고 움직이는 자세를 원한다고 생각하지 않습니까? –

관련 문제