2013-11-20 4 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: вызов, то анимация работает нормально. Но когда я добавляю поведение, анимация переходит в неправильное расположение. Я не понимаю, почему.

ответ

0

Причина, по которой в вашем примере ярлык перемещается влево, состоит в том, что вы меняете ширину метки от 100px до 320px, и текст прав обоснован.

Теперь, почему он не движется вверх, когда вы добавляете UICollisionBehavior к метке, а затем в UIDynamicAnimator, UIDynamicAnimator теперь отвечает за перемещение метки. Когда вы пытаетесь анимировать его, анимация отключается, затем UIDynamicAnimator видит это изменение и возвращает центр метки обратно в исходное. Вы можете это увидеть сами, если вы подклассифицируете UILabel и NSLog при изменении рамки и центра. Если вы переопределите setCenter, просто верните ярлык вверх.

Если вы хотите переместить этикетку;

  1. Не прикрепляйте UICollisionBehavior к ярлыку и анимировать его
  2. также прикрепить UIDynamicItemBehavior к метке, а затем addLinearVelocity
0

Вы не должны устанавливать рамку любого представления вручную, если эта точка зрения находится под управлением динамическим аниматором.
Причина, по которой она работает без вызова -addBehavior: заключается в том, что динамический аниматор не заботится о ярлыке, пока какое-либо его поведение не ссылается на метку.

Вы можете переместить метку вручную и запустить динамический аниматор, когда анимация закончена, но лучший подход - использовать UISnapBehavior, чтобы переместить ярлык в нужную позицию.

Кроме того, если вы изменили кадр представления, который управляется динамическим аниматором, вам необходимо удалить все поведения, связанные с этим представлением, и добавить их снова. Вы должны установить начальный размер вашего ярлыка и только изменить его положение оттуда, но не его размер.

0

когда вы устанавливаете кадр вашего зрения ниже этой линии написать [self.animator updateItemUsingCurrentState:label];

Смежные вопросы