UIDynamicAnimator与[UIView animateWithDuration:]之间的交互

时间:2013-11-20 14:02:58

标签: iphone core-animation uikit-dynamics

我正在尝试将视图设置为使用UIDynamics的视图中的位置。我不清楚核心动画动画和UIDynamics之间的相互作用,但我发现了一些我不明白的事情。

我有一个测试项目,视图控制器有一个视图,一个标签,从视图的底部中间开始,我试图动画到顶部中间。

// 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,那么动画效果很好。但是当我添加行为时,动画会转到错误的位置。我不明白为什么。

3 个答案:

答案 0 :(得分:0)

在您的示例中标签向左移动的原因是您将标签的宽度从100px更改为320px并且文本右对齐。

现在,为什么它没有向上移动,当你将UICollisionBehavior添加到标签,然后添加到UIDynamicAnimator时,UIDynamicAnimator现在负责移动标签。当您尝试对其进行动画处理时,动画会消失,然后UIDynamicAnimator会看到更改并将标签的中心设置回原来的状态。如果在框架和中心更改时继承UILabel和NSLog,则可以自己查看。如果您覆盖setCenter只是返回标签向上移动。

如果您想移动标签;

  1. 请勿将UICollisionBehavior附加到标签上并为其设置动画
  2. 还要将UIDynamicItemBehavior附加到标签,然后添加“线路速度”

答案 1 :(得分:0)

如果该视图由动态动画师管理,则不应手动设置任何视图的帧 它在没有调用-addBehavior的情况下工作的原因是动态动画师不关心标签,直到它的任何行为引用标签。

您可以手动移动标签并在动画结束时启动动态动画制作,但更好的方法是使用UISnapBehavior将标签移动到所需位置。

此外,如果更改由动态动画师管理的视图框架,则必须删除与该视图关联的所有行为并再次添加。您应该设置标签的初始大小,并且只从那里改变它的位置,而不是它的大小。

答案 2 :(得分:0)

当您在该行下方设置视图的帧时 [self.animator updateItemUsingCurrentState:label];