【发布时间】: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