代码仅在ViewDidLoad方法中工作

时间:2010-09-24 21:23:53

标签: iphone objective-c

我在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)的沟通不畅。

在你的例子中,它在同一个班级中运作良好。

2 个答案:

答案 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:可能有效,但它更像是黑客。

如果您希望动画在显示视图后立即发生,您应该将其放在viewDidLoadviewWillAppearviewDidAppear中。你是否介意在[{1}}中分享你不想这样做的原因?