我正尝试在使用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:调用,那么动画就能正常工作。但是当我添加行为时,动画转到了错误的位置。我不明白为什么。
发布于 2014-02-28 19:02:32
在您的示例中标签向左移动的原因是因为您将标签的宽度从100px更改为320px,并且文本是右对齐的。
现在,至于为什么不向上移动,当您将UICollisionBehavior添加到label,然后添加到UIDynamicAnimator时,UIDynamicAnimator现在负责移动label。当您尝试将其设置为动画时,动画会关闭,然后UIDynamicAnimator会看到更改,并将标签的中心设置回原来的位置。当框架和中心改变时,如果你继承了UILabel和NSLog的子类,你可以自己看到这一点。如果将setCenter覆盖为只返回,则标签将向上移动。
如果您想要移动标签;
发布于 2014-02-28 19:11:11
如果视图由动态动画制作人员管理,则不应手动设置该视图的框架。
它在不调用-addBehavior的情况下工作的原因是,在动态动画设计器的任何行为引用标签之前,它并不关心标签。
您可以手动移动标签,并在动画完成后启动动态动画生成器,但更好的方法是使用UISnapBehavior将标签移动到所需的位置。
此外,如果更改由动态动画制作程序管理的视图的框架,则必须删除与该视图关联的所有行为,然后重新添加它们。你应该设置你的标签的初始大小,并且只改变它的位置,而不是它的大小。
发布于 2015-01-23 19:29:29
当您将视图框架设置在该行下方时,编写[self.animator updateItemUsingCurrentState:label];
https://stackoverflow.com/questions/20098021
复制相似问题