2014-04-15 2 views
0

에서 상속 된 DropitBehavior이라는 클래스가 있습니다. 내 UIViewController에는 두 가지 속성이 있습니다.어디에서 UIDynamicAnimator에 대한 addBehavior를 호출해야합니까?

@property (strong, nonatomic) UIDynamicAnimator *animator; 
@property (strong, nonatomic) DropitBehavior *dropitBehavior; 

지연 초기화 장치는 아래에 정의되어 있습니다. 그리고 애니메이션이 올바르게 실행됩니다.

- (UIDynamicAnimator *)animator 
{ 
    if (!_animator) { 
     _animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.gameView]; 
     //[_animator addBehavior:self.dropitBehavior]; 
    } 

    return _animator; 
} 

- (DropitBehavior *)dropitBehavior 
{ 
    if (!_dropitBehavior) { 
     _dropitBehavior = [[DropitBehavior alloc] init]; 
     [self.animator addBehavior:_dropitBehavior]; 
    } 

    return _dropitBehavior; 
} 

하지만 animator 초기화에 addBehavior를 호출하는 경우, 전혀 애니메이션 없을 것이다. 내가 이해하는 한, 애니메이션은 두 가지 방식으로 실행되어야합니다. 두 번째 방법은 무엇이 잘못 되었나요?

답변

1

@property의 게터를 덮어 쓰고 있으므로 코드로 판단하면 dropitBehavior 메서드에서 호출 할 때까지 애니메이터가 만들어지지 않습니다.

일반적으로 viewDidLoad 또는 viewWillAppear 메쏘드의 비헤이비어를 애니메이터에 추가하므로 뷰를 애니메이션화 할 준비가되었음을 알 수 있습니다. 코드는 다음과 같이 보일 것입니다 :

- (UIDynamicAnimator *)animator { 
    if (!_animator) { 
     _animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.gameView]; 
    } 
    return _animator; 
} 

- (DropitBehavior *)dropitBehavior { 
    if (!_dropitBehavior) { 
     _dropitBehavior = [[DropitBehavior alloc] init]; 
    } 
    return _dropitBehavior; 
} 

-(void)viewWillAppear { 
    [super viewWillAppear]; 
    [self.animator addBehavior:self.dropitBehavior]; 
} 
+0

'dropitBehavior' 또한 속성입니다. 나는'animator'가'alloc'과'init'을 호출 한 후에 만들어 졌다고 생각합니다. – amazingjxq

+1

'.animator' 속성이 다른 곳에서 사용 된 경우에만 해당합니다. 그렇지 않으면'- (UIDynamicAnimator *) animator' 메소드는 결코 호출되지 않으므로'alloc'' init'은 실행되지 않습니다 –

+0

고맙습니다. 그게 내가 원하는거야. – amazingjxq