为什么didFinishLaunchingWithOptions中的动画失败了?

时间:2012-05-20 09:47:30

标签: ios core-animation

我只想在didFinishLaunchingWithOptions中用动画来显示视图,我的代码如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    CGRect finalRect = CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height);

    UIImage *image = [UIImage imageNamed:@"122.jpg"]; 

    UIButton* pic = [[UIButton alloc] initWithFrame:finalRect];
    [pic setBackgroundImage:image forState:UIControlStateNormal];
    [pic setHidden:true];
    pic.center = CGPointMake(finalRect.size.width / 2, finalRect.size.height / 2);


    UIViewController* controller = [[UIViewController alloc] init];
    [controller setView:pic];

    [self.window setRootViewController:controller];
    [self.window makeKeyAndVisible];


    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:2.5];
    [pic setHidden:false];
    [UIView commitAnimations];

    return YES;
}

但动画根本不起作用。带有图片的子视图突然显示在屏幕上。但是,如果我使用按钮来触发动画代码,则视图将显示动画。对didFinishLaunchingWithOptions有什么限制吗?

PS:

通过将动画代码移动到控制器的viewDidAppear proc中解决此问题,就像下面的rokjarc所述。

但是还有另一个解决办法,就是在从didFinishLaunchingWithOptions调用的延迟例程中执行动画代码,如:

[self performSelector:@selector(executeAnimation) withObject:nil afterDelay:1];

1 个答案:

答案 0 :(得分:2)

您的按钮会被controller.view覆盖,该window.view也会加载到pic之上的controller::viewDidAppear

您可以将代码移至controller.view

来解决此问题

如果您决定采用这种方式,请不要忘记将按钮添加到appDelegate.window而不是YES

由于看起来您只想在应用程序启动时显示此动画,您可以设置向控制器添加名为showAnimation的BOOL属性。将此属性设置为didFinishLaunchingWithOptions:中的NOcontroller::viewDidAppear末尾的if (self.showAnimation)...

这样您就可以有条件地(controller::viewDidAppear)只显示一次所需的动画({{1}})。