【问题标题】:View not animating with Autolayout视图不使用自动布局设置动画
【发布时间】:2013-03-20 18:16:12
【问题描述】:

我一直在搜索 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]; 部分,该操作会将视图定位在正确的位置......但它不会在那里设置动画。它只是在视图出现时立即出现。

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

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

【问题讨论】:

  • 我看到当我在viewDidLoad 中执行此操作时,但在我遵循viewDidAppear 时可以正常工作。
  • 等等。所以你说当你把 [self animateButton:myView];在您的 viewDidAppear 中,它不是从左上角的 1x1 像素动画?嗯...无论我将它加载到哪个位置,它都会发生在我身上。我倾向于只制作两个不同的故事板——一个用于 iPhone 5,一个用于其他所有内容,然后继续使用我的原始代码。呃,这很令人沮丧。
  • 是的,这就是我的经验。我只是对其进行了测试以确保我没有失去理智并确认了这一点。最重要的是,在viewDidAppear(或更高版本)中进行基于块的约束动画(包括对layoutIfNeeded 的调用)对我来说效果很好,尽管当我在viewDidLoad 中这样做时,我看到了你描述的行为。跨度>

标签: ios uiview uiviewanimation autolayout


【解决方案1】:

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

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

(在本例中,topLayoutConstraint 是我在 Interface Builder 中为我想要动画的控件上的顶部垂直约束定义的 IBOutlet。)

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

【讨论】:

  • 感谢您的 cmets,他们肯定对诊断有所帮助。总的来说,我有两个问题。 1.) 我移动了 [self animateButton];进入 viewDidAppear 而不是 viewWillAppear。 2.) 我再次从您的代码中得到提示并更改了 [myView layoutIfNeeded];转到 [self.view layoutIfNeeded];巴姆——效果很好!谢谢你的帮助。
猜你喜欢
  • 2013-10-21
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多