UIView 动画发生在错误的方向

Posted

技术标签:

【中文标题】UIView 动画发生在错误的方向【英文标题】:UIView animation happens in the wrong direction 【发布时间】:2014-09-05 17:09:24 【问题描述】:

由于某种原因,我的UIImageView 动画到它的开始位置,从它的结束位置。我不知道为什么,但感觉这与使用约束有关(我在整个应用程序中对所有 UIViews 都使用了约束)。

我的动画应该使 logoImageView 离开屏幕顶部。

这是我的代码:

NSLog(@"%@", NSStringFromCGPoint(self.logoImageView.center));

[self.logoImageView updateConstraintsIfNeeded];

[UIView animateWithDuration:3.0f
                 animations:^
                     [self.logoImageView setCenter:CGPointMake(CGRectGetMidX(self.logoImageView.frame),
                                                               CGRectGetMaxY(self.view.frame) + CGRectGetHeight(self.logoImageView.frame))];

                     [self.logoImageView updateConstraintsIfNeeded];
                  completion:^(BOOL finished) 
                     NSLog(@"%@", NSStringFromCGPoint(self.logoImageView.center));

                     [self performSegueWithIdentifier:@"Play" sender:nil];
                 ];

这是我的职位日志:

2014-09-05 18:08:56.673 Cups[2142:89629] 160, 111.5
2014-09-05 18:09:01.250 Cups[2142:89629] 160, 645

但动画播放相反。有什么想法吗?

【问题讨论】:

我还应该说,我也尝试在 self.view 上调用 updateConstraintsIfNeeded,结果相同 我认为正确的方法是动画约束而不是定位或框架。 【参考方案1】:

这可能与您在没有实际更新约束的情况下调用 -updateLayoutConstraints 的事实有关。

更好的方法是为约束设置动画,而不是设置视图的位置和框架。要记住的一个好技巧是,您可以在您的 XIB 中根据您的约束创建出口。

假设您在视图控制器中有一个名为logoImageViewTopConstraintNSLayoutConstraint 设置为IBOutlet,它将logoImageView 的顶部设置为它的超级视图的顶部布局指南。在设计时将该约束的常数设置为 100 左右(将其从视图顶部向下移动 100 个点)。然后有了这个约束,你可以为你的动画做这样的事情:

[self.view layoutIfNeeded];
self.logoImageViewTopConstraint.constant = 0;   // moves image view back to the top
[self.view setNeedsUpdateConstraints];    
[UIView animateWithDuration:0.8 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^
    [self.view layoutIfNeeded];             // interpolates animation from changes to constraints
 completion:^(BOOL finished) 
    // done
];

如果你让它工作,只需使用约束的常量,直到你得到你想要的确切效果。

【讨论】:

【参考方案2】:

如果你这样做会发生什么:

[UIView animateWithDuration:3.0f
                 animations:^
                 
                     [self.logoImageView setCenter:CGPointMake(CGRectGetMidX(self.logoImageView.frame),
                                                           -(CGRectGetHeight(self.logoImageView.frame)/2)];

                  completion:^(BOOL finished) 
                 
                     [self performSegueWithIdentifier:@"Play" sender:nil];
                 ];
    动画到 y 中心 = -(logoHeight/2)。这是 ios 坐标中的“屏幕顶部” 不要在动画块中调用 updateConstraints

【讨论】:

【参考方案3】:

原来在 UIView 层上运行的 CABasicAnimation 正在中断 UIView 动画。感谢您的建议

【讨论】:

以上是关于UIView 动画发生在错误的方向的主要内容,如果未能解决你的问题,请参考以下文章

在快速静态错误中为自定义 UIView 设置动画

UIView 显示错误的方向

为啥我的 UIView 动画到错误的位置?

滑动 UIView 时出现动画错误

知道为啥下面的 UIView 动画只在一个方向上起作用吗?

iOS:UIView 动画,没有动画发生