使用自动布局时,视图不进行动画处理

3

我在 Stack Overflow 上搜索了一些相关的帖子,但没有一个解决我的问题。 我在故事板中设置了一个视图,并通过 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];

以前它表现不错,但是...我们都知道这在自动布局中不起作用了。所以我将其更改为以下内容:

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

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

当动作发生时,视图不会像在Storyboard中设置的那样从初始位置开始,而是以1x1像素视图的形式从左上角开始动画向下移动到最终位置(而不是向上移动15像素,这是我原本想要的效果)。
现在,如果我删除部分,动作将把视图定位在完全正确的位置...但它不会以动画方式出现。它只是突然出现在视图中。
第一张截图是初始位置。 第二个截图是视图应该停留的位置。 第三个是视图从错误的位置和方向动画。
你有什么想法/评论?我到底做错了什么?我以为这很容易...我肯定漏掉了一些显而易见的东西。

我发现当我在viewDidLoad中执行时,它出现问题,但是当我推迟到viewDidAppear时,它正常工作。 - Rob
等等。你的意思是说,当你在viewDidAppear中放置[self animateButton:myView];时,它不会从左上角的1x1像素处进行动画?嗯...无论我在哪个位置加载它,它都会发生。我倾向于制作两个不同的故事板-一个用于iPhone 5,另一个用于其他所有设备,并继续使用我的原始代码。唉,这真让人沮丧。 - Drew
是的,那是我的经验。我刚刚测试了一下,以确保我没有疯掉,并确认了这一点。总之,在viewDidAppear(或更晚)中执行基于块的约束动画(包括对layoutIfNeeded的调用)对我来说运行良好,尽管当我在viewDidLoad中执行时,我看到了你所描述的行为。 - Rob
1个回答

6
当我在viewDidLoad中调用以下基于块的动画时,它会将框架从CGRectZero动画到最终位置。但是如果我在viewDidAppear中调用,则正常工作。
- (void)animateMovementByConstraint
{
    [UIView animateWithDuration:0.5
                     animations:^{
                         self.topLayoutConstraint.constant = 100;
                         [self.view layoutIfNeeded];
                     }];
}

在这个例子中,topLayoutConstraint 是我在Interface Builder中为我想要进行动画的控件定义的顶部垂直约束的IBOutlet
有了自动布局,因为我开始在viewDidAppear中启动我的动画,我就没有遇到任何问题。

1
感谢您的评论,它们确实有助于诊断。总体而言,我有两个问题。1.) 我将 [self animateButton]; 移到了 viewDidAppear 而不是 viewWillAppear 中。2.) 我再次从您的代码中得到了提示,并将 [myView layoutIfNeeded]; 更改为 [self.view layoutIfNeeded]; 搞定了 - 太棒了!感谢您的帮助。 - Drew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接