2010-09-24 55 views
1

我后使用此代码在我viewDidLoad方法:代码只有在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,因此我假设该视图已被加载?我应该添加一个条件来确保视图被加载吗?


编辑后米哈尔的评论

我按下按钮使用这个IBAction为在MyViewController.m:

- (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)很好地发挥作用。

在你的例子中,它在同一个类中运行良好。

回答

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]; 
} 
+0

对不起,这只是一个错字,我已经编辑了这个问题。 – 2010-09-24 21:51:35

+0

你真的在改变框架吗?因为你在'viewDidLoad'中设置了与'setViewMovedUp:'中相同的帧。还是又是一个错字? – Michal 2010-09-25 07:52:40

+0

尝试将NSLog更改为NSLog(@“test movedUp from:%@”,NSStringFromCGRect(self.view.frame));'并比较这些帧。如果帧是相同的,那么就没有动画。 – Michal 2010-09-25 07:53:55

1
MainViewController *moveUp = [[MainViewController alloc] init]; 
[moveUp setViewMovedUp:YES]; 

这不起作用,因为moveup.view不会是有效的,直到......你猜怎么着,其viewDidLoad被调用后。 (或更具体地说,loadView

使用performSelector:withObject:afterDelay:可能工作,但它更像是一个黑客。

如果您希望动画在显示视图后立即发生,那么您应该将其放在viewDidLoadviewWillAppearviewDidAppear之内。你介意分享你不想在viewDidLoad这样做的原因吗?

相关问题