UIView动画发生在错误的方向

时间:2014-09-05 17:09:25

标签: ios objective-c uiview

出于某种原因,我的UIImageView从其结束位置动画到其起始位置。我无法理解为什么但是感觉它与使用约束有关(我在我的应用程序中对所有UIView使用约束)。

我的动画应该在屏幕顶部设置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}

但动画则反过来。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

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

[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];
                 }];
  1. 动画到y center = - (logoHeight / 2)。这是iOS坐标中的“屏幕顶部”
  2. 不要在动画块中调用updateConstraints

答案 1 :(得分:0)

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

更好的方法是设置约束的动画,而不是设置视图的位置和框架。要记住的一个好方法是,您可以在XIB中创建符合约束的插座。

假设您在视图控制器中设置了一个名为NSLayoutConstraint的{​​{1}}作为IBOutlet,它将logoImageViewTopConstraint的顶部设置为superview的顶级布局指南。在设计时将约束的常数设置为100左右(从视图顶部向下移动100个点)。然后使用该约束,你可以为你的动画做这样的事情:

logoImageView

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

答案 2 :(得分:0)

事实证明,在UIView层上运行的CABasicAnimation正在中断UIView动画。谢谢你的建议