2010-01-08 4 views
2

В моем приложении iPhone на основе TabBar я хотел бы отобразить страницу приветствия с полным экраном (с некоторыми журналами) до загрузки фактического приложения. Как загрузить UIView из файла xib как экран приветствия, а затем оттуда я могу загрузить приложение на основе TabBar.Загрузка экрана приветствия (Splash Screen) перед TabBarController

Спасибо заранее,

ответ

5

Правильный способ сделать это будет загрузить приложение панели вкладок обычно, но использовать presentModalViewController:animated: метод контроллера панели вкладок, чтобы отобразить контроллер представления над ним (в application:didFinishLaunching:):

SplashScreenController *controller = [[SplashScreenController alloc] initWithNibNamed:nil bundle:nil]; 
[self.tabBarController presentModalViewController:controller animated:YES]; 
[controller release]; 

I Подскажите, как правило, поставить кнопку „распускать“ на заставке, но вы можете сделать что-то вроде этого:

[self.tabBarController performSelector:@selector(dismissModalViewControllerAnimated:) withObject:YES afterDelay:2.0]; 

который представит контроллер представления на старте и увольнять его через две секунды. Измените YES es на NO s, чтобы избежать анимации слайд-вниз.

+0

Привет, я попробовал и его загрузил вид [window addSubview: tabBar.view]; [окно makeKeyAndVisible]; [self.tabBar presentModalViewController: контроллер анимированный: NO]; Я положил кнопку в SplashScreen, чтобы уволить, а код, который я использовал для отклонения, - UIView * currentView = self.view; [currentView removeFromSuperview]; он закроет экран заставки, но не покажет TabBar. не могли бы вы помочь мне решить эту проблему? –

+0

Что вы хотите сделать, это вызвать '[self.parentViewController rejectModalViewControllerAnimated: YES]' (или 'NO'). –

+0

Огромное спасибо ... –

3

добавить подвид в главном окне в AppDelegate:

LoginViewController *loginController = [[LoginViewController alloc] initWithNibName:@"LoginViewController" 
                      bundle: nil]; 
[window addSubview: [loginController view]]; 

Тогда в LoginViewController, когда я готов уволить View (показать ВАШЕ tabController говорят) я:

UIView *currentView = self.view; 
UIView *theWindow = [currentView superview]; 

[currentView removeFromSuperview]; 

CATransition *animation = [CATransition animation]; 
[animation setDuration:0.5]; 
[animation setType:kCATransitionPush]; 
[animation setSubtype:kCATransitionFromBottom]; 
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 

[[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"]; 
+0

hai, Спасибо за быстрый ответ, я попробовал код, его работаю, но в нижней части есть небольшой промежуток (я вижу панель вкладок в фоновом режиме), ее размер почти в строке состояния сверху , Я думаю, что представление не загружает правильное происхождение. вы не знаете, почему это так? –

+0

Хмм..Я не знаю. У вас есть что-то на вашем наборе пружин/распорок, который может немного уменьшить нагрузку на просмотр? –

0

В одном из моих закладок стержневых приложений, я показываю заставку так:

В моем приложении объект делегата, я начинаю его отображение в didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    splashScreenVC = [[SplashScreenViewController alloc] initWithNibName:@"SplashScreenView" bundle:nil]; 

    [window addSubview:splashScreenVC.view]; 
    [window makeKeyAndVisible]; 

    //set delay before showing new screen 
    [NSTimer scheduledTimerWithTimeInterval:1.5f target:self selector:@selector(onSlashScreenExpired:) userInfo:nil repeats:NO]; 

    return YES; 
} 

onSlashScreenExpired метод выглядит следующим образом:

- (void)onSlashScreenExpired:(id)userInfo{ 
    [splashScreenVC.view removeFromSuperview]; 
    [splashScreenVC release]; 

    // At this point, create the tab bar controller and display it 
} 

Я довольно уверен, что я мощеным это вместе с другим вопроса о SO, но я не может найти его.

+0

hai, Спасибо за быстрый ответ, я попробовал код, его работа, но в нижней части есть небольшой зазор (я вижу панель вкладок в фоновом режиме), ее размер почти в строке состояния сверху , Я думаю, что представление не загружает правильное происхождение. вы не знаете, почему это так? –

+0

О да, я думаю, это случилось со мной тоже. Я пытаюсь вспомнить, что я сделал ... в вашем контроллере в наконечнике, установили ли вы его 320x480, и установили строку состояния, верхнюю панель и нижнюю панель на None? – Dana

+0

Размер изображения 320x460 и строка состояния находится на –

2

Рекомендации UI, что вы не должны иметь заставку - вы должны представить фиктивную версию зрения пользователь увидит при загрузке приложения, без каких-либо данных в нем:

см Apple iPhone UI Guidelines on Launch Images подробности - вот отрывок:

Для повышения опыта пользователя при запуске приложения , вы должны обеспечить запуск изображения. Изображение запуска выглядит очень похоже на первый экран, отображаемый на вашем дисплее . iPhone OS отображает это изображение моментально, когда пользователь отбирает значок вашего приложения на главном экране . Как только он будет готов для использования , ваше приложение отобразит первый экран , заменив заставку .

Важно подчеркнуть, что причина для запуска запускаемого изображения - улучшить работу пользователей; это не возможности обеспечить:

  • «опыт входа в приложении,» таких как заставке
  • An О окне
  • Брендинга элементов, если они не являются статической частью вашего первый экран приложения
+0

Во-вторых, что! Не используйте всплывающие экраны, на них неодобрительно отзываются обозреватели iPhone. –

+3

Это фигня, ИМО (рассуждение от Apple, то есть). Они говорят: «... образ запуска заключается в улучшении пользовательского интерфейса ...». Чем хуже пользовательский интерфейс, чем просмотр пустой таблицы, ожидающей загрузки ваших данных? Старая пословица о том, что «время на удержании, похоже, продлится в 3 раза дольше, чем фактическое время, проведенное на удержании», также применимо и здесь: я не заметил бы, что время ожидания ожидало, если бы не было так очевидно, что я ждал на этом пустом столе заполнить мои данные. Я бы предпочел, чтобы это произошло в фоновом режиме, в то время как логотип разработчика затухает (или что-то еще). Дайте мне посмотреть. – Andy

2
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{  
    splashView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"image01.png"]]; 
    splashView.frame=CGRectMake(0,21,320,460); 
    [self.window makeKeyAndVisible]; 
    [self.window addSubview:splashView]; 


    [self performSelector:@selector(splashremove) withObject:nil afterDelay:10.5]; 
    [self performSelector:@selector(sixthimage) withObject:nil afterDelay:9.0]; 
    [self performSelector:@selector(fifthimage) withObject:nil afterDelay:7.5]; 
    [self performSelector:@selector(fourthimage) withObject:nil afterDelay:6.0]; 
    [self performSelector:@selector(thirdimage) withObject:nil afterDelay:4.5]; 
    [self performSelector:@selector(secondimage) withObject:nil afterDelay:3.0]; 
    [self performSelector:@selector(firstimage) withObject:nil afterDelay:1.5]; 


    return YES; 
} 

-(void)firstimage 
{ 
    NSLog(@"Inside first image"); 
    splashView.image=[UIImage imageNamed:@"image01.png"]; 
} 


-(void)secondimage 
{ 
    NSLog(@"Inside second image"); 
    splashView.image=[UIImage imageNamed:@"image02.png"]; 
} 



-(void)thirdimage 
{ 
    NSLog(@"Inside third image"); 
    splashView.image=[UIImage imageNamed:@"image03.png"]; 
} 



-(void)fourthimage 
{ 
    NSLog(@"Inside fourth image"); 
    splashView.image=[UIImage imageNamed:@"image04.png"]; 
} 



-(void)fifthimage 
{ 
    NSLog(@"Inside fifth image"); 
    splashView.image=[UIImage imageNamed:@"image05.png"]; 
} 



-(void)sixthimage 
{ 
    NSLog(@"Inside sixth image"); 
    splashView.image=[UIImage imageNamed:@"image06.png"]; 


} 

-(void)splashremove 
{ 
    NSLog(@"Inside splashremove image"); 

    [splashView removeFromSuperview]; 
    [splashView release]; 

    [self.window addSubview:tabBarController.view]; 
    [self.window makeKeyAndVisible]; 

} 
+1

кажется хорошим ответом. Я знаю, что настоящий modal view controller действительно лучший, но если вы хотите сохранить его простым, это так же хорошо. Одна из проблем, однако, вы не можете получать ротации в делегате приложения, поэтому вы не можете использовать его для приложения с авторотированием. – George