1

我正在尝试将视图设置为使用 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: 调用,那么动画效果很好。但是当我添加行为时,动画会转到错误的位置。我不明白为什么。

4

3 回答 3

0

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

现在至于为什么它不上移,当你将 UICollisionBehavior 添加到标签,然后添加到 UIDynamicAnimator 时,UIDynamicAnimator 现在负责移动标签。当您尝试对其进行动画处理时,动画会消失,然后 UIDynamicAnimator 会看到更改并将标签的中心设置回原来的位置。如果您在框架和中心更改时将 UILabel 和 NSLog 子类化,您可以自己看到这一点。如果您覆盖 setCenter 以仅返回您的标签向上移动。

如果你想移动标签;

  1. 不要将 UICollisionBehavior 附加到标签并为其设置动画
  2. 还要将 UIDynamicItemBehavior 附加到标签,然后 addLinearVelocity
于 2014-02-28T11:02:31.607 回答
0

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

您可以手动移动标签并在动画完成后启动动态动画制作器,但更好的方法是使用 aUISnapBehavior将标签移动到所需位置。

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

于 2014-02-28T11:11:10.590 回答
0

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

于 2015-01-23T11:29:28.847 回答