UIView 动画发生在错误的方向
Posted
技术标签:
【中文标题】UIView 动画发生在错误的方向【英文标题】:UIView animation happens in the wrong direction 【发布时间】:2014-09-05 17:09:24 【问题描述】:由于某种原因,我的UIImageView
动画到它的开始位置,从它的结束位置。我不知道为什么,但感觉这与使用约束有关(我在整个应用程序中对所有 UIView
s 都使用了约束)。
我的动画应该使 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 中根据您的约束创建出口。
假设您在视图控制器中有一个名为logoImageViewTopConstraint
的NSLayoutConstraint
设置为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 动画发生在错误的方向的主要内容,如果未能解决你的问题,请参考以下文章