我正在运行xcode-4.2,该项目基于ios5使用故事板。
我使用Apple提供的模板创建了一个视图应用程序。 在故事板中我删除了为我创建的viewcontroller并添加了一个UITabBarController。 接下来,我添加了一个新类MyTabBarController,它是UITabBarController的子类。
现在我想在TabBar出现之前显示一个闪屏。所以我可以在后台进行一些加载和计算。
我认为AppDelegate.m会是个好地方。既然那是我的rootview加载的地方吗?或者在我的情况下是否应该从rootviewcontroller中显示启动画面是MyTabBarController?
所以我创建了一个xib文件。我很惊讶您可以将.xib文件添加到ios5故事板项目中。 xib文件名为SplashView.xib,它有一个视图,上面有图像。
AppDelegate中的代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
_splashScreen = [[UIViewController alloc] initWithNibName:@"SplashView" bundle:nil];
//_splashScreen is defined as:@property (strong, nonatomic) UIViewController *splashScreen;
[_window.rootViewController presentModalViewController:_splashScreen animated:NO];
[self performSelector:@selector(hideSplash) withObject:nil afterDelay:2];
return YES;
}
问题是没有任何反应。即使我将值从2更改为200.应用程序启动时就像没有闪屏一样。
您可能已经注意到我仍在努力设计objective-c和iphone应用程序。我希望对我的问题给出一个合适的答案会使这个问题更清晰。
提前致谢!
答案 0 :(得分:8)
启动画面内置于iOS应用程序中。您需要做的就是创建一个名为Default.png和Default@2x.png的文件(用于视网膜显示),它将作为应用程序启动时的启动画面。
您还可以在应用info.plist中设置这些图片的内容。
答案 1 :(得分:2)
我曾与一些想要使用动画效果的客户打过交道。 虽然我完全反对这一点,但是在Apple的HIG之后, 那些客户只是不明白......
无论如何,因为- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
必须返回布尔值,
不要因为任何事情而停止它是非常重要的。
此外,由于启动时间是由iOS测量的,如果花费太长时间,应用程序将被iOS终止!
出于这个原因,我经常使用- (void)applicationDidBecomeActive:(UIApplication *)application;
带有某种标志,表示它是在发射时还是从后台模式返回时发生的。
或者,您应该使用NSTimer
或- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
因此,didFinishLaunchingWithOptions
可以返回而不会被阻止以处理您的动画效果。
此延迟performSelector
不仅应用于隐藏动作(如您的预期方式),还应用于启动动画。
答案 2 :(得分:2)
如果您使用的是故事板,则只需将UIImageView
添加到window.rootViewController.view
,就像这样:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UIImage *splashImage = [UIImage autoAdjustImageNamed:@"Default.png"];
UIImageView *splashImageView = [[UIImageView alloc] initWithImage:splashImage];
[self.window.rootViewController.view addSubview:splashImageView];
[self.window.rootViewController.view bringSubviewToFront:splashImageView];
[UIView animateWithDuration:1.5f
delay:2.0f
options:UIViewAnimationOptionCurveEaseInOut
animations:^{
splashImageView.alpha = .0f;
CGFloat x = -60.0f;
CGFloat y = -120.0f;
splashImageView.frame = CGRectMake(x,
y,
splashImageView.frame.size.width-2*x,
splashImageView.frame.size.height-2*y);
} completion:^(BOOL finished){
if (finished) {
[splashImageView removeFromSuperview];
}
}];
return YES;
}
我认为直接将UIImageView
添加到window
的原因是因为当隐藏默认值时,iOS会将rootViewController.view
置于前面。这将与动画重叠。这意味着动画确实发生了,但它位于rootViewController
。
答案 3 :(得分:0)
我只是将相同的图像添加到我的第一个视图控制器的启动图像,然后淡化它(或者你需要的任何动画) - 这可以避免暂停appDelegate中的应用程序加载。 您需要确保图像具有与发布图像相同的大小和来源,例如将图像设置为在我的第一个视图控制器上显示,该控制器是一个tableViewController:
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.tableView.bounds];
imageView.image = [UIImage imageNamed:@"[imagename]"];
[self.tableView addSubview:imageView];
[self.tableView bringSubviewToFront:imageView];
// Fade the image
[self fadeView:imageView];
-(void)fadeView:(UIView*)viewToFade
{
[UIView animateWithDuration:FADE_DURATION
animations:^ {
viewToFade.alpha = 0.0;
}
];
}