3

我一直在搜索 SO 并找到了一些相关的帖子,但没有一个(还)解决了我的问题。

我的情节提要中有一个视图设置,通过一个 IBOulet 连接了一个约束。在某个动作后,视图应该向上移动(或向下移动到它的初始位置)。对于我的生活,我无法让它正常工作。在自动布局之前,我运行了这段代码:

- (void)animateStarBackground:(NSString *)animationID
                 finished:(NSNumber *)finished
                  context:(void *)context
                   myView:(UIView *)myView
                     xPos:(float)xPos
                     yPos:(float)yPos {

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.2];
    [UIView setAnimationDelay:0.5];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDelegate:self];

    myView.center = CGPointMake(xPos, yPos);

[UIView commitAnimations];

}

它曾经很好用,但无论如何......我们都知道这在 Autolayout 中不再适用了。所以我将其更改为以下内容:

-(void)animateButton:(UIView *)myView {

    [UIView animateWithDuration:8.0f animations:^{
        _viewConstA.constant = 45.0;
        [myView layoutIfNeeded];
    }];

}

当动作发生时,它不是从故事板中设置的初始位置开始,而是从左上角的 1x1 像素视图开始,并向动画到它的最终静止位置(而不是像我一样向上移动 15 个像素打算)。

现在,如果我取出[myView layoutIfNeeded]; 部分,该动作将视图定位在正确的位置......但它没有在那里设置动画。它只是在视图出现时立即出现。

第一个屏幕抓取是初始位置。第二次抓取应该是意见的最后休息地。第三是从错误的位置和方向动画的视图。

想法/评论?我到底做错了什么?我认为这很容易......我必须遗漏一些明显的东西。

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

6

当我从 调用以下基于块的动画时viewDidLoad,它会将帧动画从CGRectZero到最终位置。但是,如果我从 调用它viewDidAppear,它会按预期工作。

- (void)animateMovementByConstraint
{
    [UIView animateWithDuration:0.5
                     animations:^{
                         self.topLayoutConstraint.constant = 100;
                         [self.view layoutIfNeeded];
                     }];
}

(在这个例子中,topLayoutConstraintIBOutlet我在 Interface Builder 中为我想要动画的控件上的顶部垂直约束定义的。)

使用自动布局,自从我开始在 中启动动画以来viewDidAppear,我没有遇到任何问题。

于 2013-03-21T04:17:34.547 回答