2013-11-20 2 views
1

UIDynamics를 사용하는 뷰에서 뷰를 위치에 애니메이션으로 표시하려고합니다. Core Animation 애니메이션과 UIDynamics 사이의 상호 작용에 대해서는 명확하지 않지만 이해할 수없는 일이 일어나고 있습니다.UIDynamicAnimator와 [UIView animateWithDuration :] 간의 상호 작용

단일보기, 레이블,보기의 아래쪽 중간에서 시작하는보기 컨트롤러가있는 테스트 프로젝트가 있고 맨 위 중간에 동작을 애니메이션하려고합니다.

// Create the label 
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(160, 400, 100, 50)]; 
label.text = @"hello"; 
[self.view addSubview:label]; 

// Set up the animator and collision 
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; 

UICollisionBehavior *collisionBehaviour = [[UICollisionBehavior alloc] initWithItems:@[ label ]]; 
[collisionBehaviour addBoundaryWithIdentifier:@"wall" 
            fromPoint:CGPointMake(0, 50) 
             toPoint:CGPointMake(320, 50)]; 
[self.animator addBehavior:collisionBehaviour]; 

// Animate the label 
[UIView animateWithDuration:1.0 
       animations:^{ 
        label.frame = CGRectMake(160, 100, 320, 100); 
       }]; 

이것은 단순히 내 애니메이션의 시작 또는 끝 위치 근처에있는보기 상단의 선 경계입니다. 버튼의 초기 위치로의 애니메이션에 왜 영향을 주는지는 모르겠지만 그렇습니다.

addBehaviour : call을 주석 처리하면 애니메이션이 제대로 작동합니다. 그러나 비헤이비어를 추가하면 애니메이션이 잘못된 위치로 이동합니다. 나는 왜 그런지 이해하지 못한다.

답변

0

레이블이 왼쪽으로 이동하는 이유는 레이블의 너비가 100px에서 320px로 변경되고 텍스트가 오른쪽 정렬되기 때문입니다.

UICollisionBehavior를 레이블에 추가 한 다음 UIDynamicAnimator에 추가하면 UIDynamicAnimator가 이제 레이블 이동을 담당합니다. 애니메이션을 시도하고 애니메이션을하면 애니메이션이 사라지고 UIDynamicAnimator가 변경 사항을 확인하고 레이블의 중심을 원래의 원래 위치로 다시 설정합니다. UILabel과 NSLog를 서브 클래 싱하면 프레임과 중심이 바뀔 때 이것을 직접 볼 수 있습니다. setCenter를 재정 의하여 레이블을 반환하는 경우에만 위로 이동하십시오.

레이블을 이동하려는 경우;

  1. 레이블에 UICollisionBehavior를 부착하고
  2. 또한 다음 addLinearVelocity을 라벨에 UIDynamicItemBehavior를 첨부하여 애니메이션을하지 마십시오
0
해당 뷰가 관리하는 경우는 수동으로 뷰의 프레임을 설정해서는 안

동적 인 애니메이터에 의해.
-addBehavior를 호출하지 않고 작동하는 이유는 동적 애니메이터가 레이블을 참조 할 때까지 동적 애니메이터가 레이블을 신경 쓰지 않는다는 것입니다.

애니메이션이 끝나면 레이블을 수동으로 이동하고 동적 애니메이터를 시작할 수 있지만 더 나은 방법은 UISnapBehavior을 사용하여 라벨을 원하는 위치로 이동하는 것입니다.

또한 동적 애니메이터가 관리하는보기의 프레임을 변경하면 해당보기와 관련된 모든 동작을 제거하고 다시 추가해야합니다. 라벨의 초기 크기를 설정하고 위치의 크기 만 변경하면됩니다.

0

해당 프레임 아래에보기 프레임을 설정할 때 [self.animator updateItemUsingCurrentState:label];

관련 문제