我一直在寻找SO并找到了一些相关的帖子,但没有一个(还)解决了我的问题。
我的故事板中有一个视图设置,通过IBOulet连接约束。在某个动作后,视图应向上移动(或向下移动到其初始位置)。对于我的生活,我无法让它正常工作。在autolayout之前,我运行了这段代码:
- (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]; 部分,该操作会将视图放在恰当的位置......但它不会在那里制作动画。当视图出现时,它就在那里。
第一个屏幕抓取是初始位置。 第二次抓住应该是最后休息的地方。 第三是从错误的点和方向制作动画的视图。
思考/评论?我到底做错了什么?我认为这将是如此简单......我必须错过一些明显的东西。
答案 0 :(得分:6)
当我从viewDidLoad
调用以下基于块的动画时,它会将帧从CGRectZero
设置为最终位置。但是如果我从viewDidAppear
调用它,它就会按预期工作。
- (void)animateMovementByConstraint
{
[UIView animateWithDuration:0.5
animations:^{
self.topLayoutConstraint.constant = 100;
[self.view layoutIfNeeded];
}];
}
(在此示例中,topLayoutConstraint
是我在Interface Builder中为我想要设置动画的控件的顶部垂直约束定义的IBOutlet
。)
使用自动布局,因为我已经开始在viewDidAppear
中启动动画,所以我没有遇到任何问题。