我在ViewDidLoad方法中使用此代码:
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:.5];
self.view.frame = CGRectMake(0, 0, 250, 50);
[UIView commitAnimations];
它工作正常,但如果我尝试在同一个实现文件中的其他方法中执行相同的操作,如下所示:
- (void)setViewMovedUp:(BOOL)movedUp {
NSLog(@"test movedUp ");
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:.5];
self.view.frame = CGRectMake(0, 0, 250, 50);
[UIView commitAnimations];
}
然后动画不再起作用(但NSLog仍然打印)。为什么此方法的行为与“ viewDidLoad ”之后的行为不同?按下按钮后会调用 setViewMovedUp ,因此我假设视图已加载?我应该添加条件以确保加载视图吗?
在Michal评论之后编辑:
我按下的按钮在MyViewController.m中使用此IBAction:
- (IBAction)viewUp {
MainViewController *moveUp = [[MainViewController alloc] init];
[moveUp setViewMovedUp:YES];
}
这是MainViewController.m中的代码:
- (void)setViewMovedUp:(BOOL)movedUp {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
self.view.frame = CGRectMake(0, 0, 250, 250);
[UIView commitAnimations];
}
Button的IBAction与MainViewController方法(setViewMovedUp)的沟通不畅。
在你的例子中,它在同一个班级中运作良好。
答案 0 :(得分:2)
您可以设置不同的视图,第一种情况为self.containerView,第二种情况为self.view。
在Julz编辑后回答:
现在很清楚你做错了什么。您无法在刚创建的对象上调用动画,因为它尚未在屏幕上显示。您需要稍后执行动画代码(至少在下一个循环的执行中),通常使用performSelector:withObject:afterDelay或blocks。
例如:
- (void)setViewMovedUp:(BOOL)movedUp {
[self performSelector:@selector(animateViewUp:) withObject:nil afterDelay:0.0];
}
- (void)animateViewUp:(id)o {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
self.view.frame = CGRectMake(0, 0, 250, 250);
[UIView commitAnimations];
}
答案 1 :(得分:1)
MainViewController *moveUp = [[MainViewController alloc] init];
[moveUp setViewMovedUp:YES];
这不起作用,因为moveup.view
在调用viewDidLoad
后猜测是什么时才会生效。 (或更具体地说,loadView
)
使用performSelector:withObject:afterDelay:
可能有效,但它更像是黑客。
如果您希望动画在显示视图后立即发生,您应该将其放在viewDidLoad
,viewWillAppear
或viewDidAppear
中。你是否介意在[{1}}中分享你不想这样做的原因?