2009-02-16 2 views

ответ

26

Самый простой способ сделать это - создать образ UIImageView, который является вашим Default.png. В вашем приложении applicationDidFinishLaunching: добавьте это представление изображения в свое окно и скройте его, когда вы хотите, чтобы ваш экран заставки исчез.

+1

Я просто хочу Почему все говорят точно «Default.png». В чем смысл? – efeyc

+13

Поскольку Apple распознает образ по умолчанию по умолчанию, если его имя является default.png –

39

Ознакомьтесь с Руководством по интерфейсу для iPhone Apple (HIG). «Заставка» не предназначена для брендинга или отображения логотипа, он должен выглядеть как состояние по умолчанию приложения, поэтому он, похоже, быстро запускается.

Заставить его оставаться надолго, будет нарушением HIG.

+103

Это не отвечает на вопрос вообще. Задаваемые вопросы: «как?», А не «должен ли я?». – korona

+69

Иногда «не делай этого» - лучший ответ на «как». –

+18

Для справки Я согласен, что вы не должны этого делать, но я до сих пор не согласен с этим ответом. Я соглашусь не согласиться;) – korona

3

Чтобы ваше приложение занимало больше времени для загрузки.

По всей видимости, Пол Томблин прав, что это обычно не очень хорошая идея. Default.png - это механизм, призванный заставить ваше приложение загружаться быстрее, удерживая «пустой» снимок экрана. Использование его для заставки - незначительное злоупотребление, но намеренно заставляя экран заставки появляться дольше, чем нужно, почти болен. (Это также ухудшит ваш пользовательский интерфейс. Помните, что каждую секунду экран всплеска становится видимым - это вторая, что пользователь нетерпеливо смотрит на ваш логотип, ругаясь, что переключится на первого достойного конкурента, которого они могут найти.)

Если вы пытаетесь покрыть какую-то второстепенную загрузку - например, если интерфейс загружен, и вы просто ожидаете получить некоторые данные из сети - тогда, вероятно, все в порядке, и подход Бена Готлиба в порядке. Я бы предложил добавить индикатор выполнения или счетчик, чтобы дать понять пользователю, что что-то действительно происходит.

+3

Я не согласен с тем, что намеренно затягивать загрузку приложения для брендинга обязательно «больно». Например, хранение логотипа в течение 1 дополнительной секунды кажется вполне подходящим. Однако было бы смешно откладывать приложение на значительное количество времени только для целей брендинга. – LucasTizma

1

Напишите фактический класс заставки.

Вот свободно использовать экран-заставку, которую я недавно опубликовал в своем iPhone в блоге действий: http://iphoneinaction.manning.com/iphone_in_action/2009/03/creating-a-splash-screen-part-one.html

+1

Неработающая ссылка. Да здравствует постоянная ссылка. – Damien

+0

Сайт должен войти в систему. –

21

мне нужно сделать это, чтобы блокировать показ представления таблицы, пока данные не были загружены по сети. Я использовал вариации одного я нашел здесь:

http://michael.burford.net/2008/11/fading-defaultpng-when-iphone-app.html

В интерфейсе вашего приложения делегат:


@interface AppDelegate : NSObject 
{ 
    UIImageView *splashView; 
} 

В реализации:


@implementation AppDelegate 
- (void)applicationDidFinishLaunching:(UIApplication *)application { 


    // After this line: [window addSubview:tabBarController.view]; 

    splashView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 
    splashView.image = [UIImage imageNamed:@"Default.png"]; 
    [window addSubview:splashView]; 
    [window bringSubviewToFront:splashView]; 

    // Do your time consuming setup 

    [splashView removeFromSuperview]; 
    [splashView release]; 
} 

Убедитесь, что вы есть Default.png в ресурсах

+1

Это не поддерживает портретный режим UpsideDown ... – Mark

2

Вот мой простой код заставки. «splashView» - это выход для вида , который содержит логотип изображения, идентификатор UIActivityIndicator и метку «Загрузить ..» (добавлено к моему «MainWIndow.xib» в IB). Индикатор активности установлен на «анимацию» в IB, Затем я создаю отдельный поток для загрузки данных.Когда это сделано, я удалить splashView и добавить свой нормальный вид приложения:

-(void)applicationDidFinishLaunching:(UIApplication *)application { 
    [window addSubview:splashView]; 
    [NSThread detachNewThreadSelector:@selector(getInitialData:) 
           toTarget:self withObject:nil]; 
} 

-(void)getInitialData:(id)obj { 
    [NSThread sleepForTimeInterval:3.0]; // simulate waiting for server response 
    [splashView removeFromSuperview]; 
    [window addSubview:tabBarController.view]; 
} 
+0

Этот код запускает поток предупреждений о утечке при запуске. – dubbeat

3

просто использовать сна (время в секундах); в вашем applicationDidFinishedLaunching метод

14

Я сделал это довольно просто, установив мой rootViewController на push modrolViewController, загрузив из «Splash.nib» в подкласс UIViewController, который я назвал «SplashViewController». Точный звонок был:

- (void) viewDidLoad { 
SplashViewController *splashScreen = [[[SplashViewController alloc]  
     initWithNibName:@"SplashViewController" bundle:nil] autorelease]; 
[self presentModalViewController:splashScreen animated:NO]; 
//continue loading while MVC is over top... 

Когда вы запускаете приложение, оно появляется правильно, как и экран заставки. Затем плагин SplashViewController представляет собой полноэкранный UIImageView с плеером splash, 320x480. После 1-вторых NSTimer (больше ничего, казалось, чтобы получить в пути), он стреляет timerFireMethod, специальный метод, который просто вызывает

[self dismissModalViewControllerAnimated:YES]; 

Тогда модальных VC просто скользит вниз и в сторону, оставив верхнюю Tableview. Приятно то, что в то время как MVC вверх, базовая таблица может продолжать загружать из-за независимой природы контроллеров модального просмотра. Таким образом, я не думаю, что это нарушает HIG, и на самом деле позволяет быстрее запускать. На что бы вы хотели взглянуть, милая картинка или пустой вид по умолчанию (храп)?

+0

это спасло мне огромное количество работы! спасибо за ответ убийцы! –

+0

Это также отличный способ отобразить экран аутентификации, который имитирует заставку по умолчанию. – IanStallings

+0

это лучший ответ на этой странице, странный, чтобы увидеть, что другой мусорный ответ получил более 25 голосов в настоящее время. –

0

Я согласен, что при запуске приложения может иметь смысл иметь заставку, особенно если ему нужно сначала получить некоторые данные с веб-сайта.

Что касается следующего Apple HIG - ознакомьтесь с приложением (MobileMe) iDisk; пока вы не зарегистрируете данные своего участника, приложение покажет типичный uitableview Default.png, прежде чем очень быстро покажет полноэкранный просмотр.

1

Самый простой способ - поместить основной поток приложения в режим ожидания в течение требуемого периода времени. При условии, что «Default.png» существует в связке вашего приложения будет отображаться, пока основной поток спит:

 

-(void)applicationDidFinishLaunching:(UIApplication *)application { 
    [NSThread sleepForTimeInterval:5]; 
    window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    [window setBackgroundColor:[UIColor yellowColor]]; 
    [window makeKeyAndVisible]; 
} 
 

Как вы уже знаете, это ужасно плохая идея, чтобы сделать, но он должен работать просто отлично ...

+0

Это блокирует основной поток, и если вы слушаете прослушивание любых уведомлений и некоторых других связанных с сетью материалов, они не получат их. См. Мой ответ для подхода сближения. –

18

в вашем приложенииDelegate, theres метод под названием applicationDidFinishedLaunching использует функцию сна. Передайте цифру в функции ожидания для нет. секунд, на которые вы хотите удерживать экран.


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{  
    [window makeKeyAndVisible]; 
    [window addSubview:viewController.view]; 
    sleep(5); 
    return YES; 
} 

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

KISS (Держите его простым и умным :) Я избегал реального в качестве его наступления.

+1

Это блокирует основной поток, и если вы слушаете прослушивание любых уведомлений и других сетевых материалов, они не получат их. См. Мой ответ для подхода сближения. –

+0

Лучший и простой способ, на мой взгляд, даже со стороны памяти. Должен быть правильный ответ на этот [старый] вопрос – Aluminum

+0

Согласитесь с Ankit, спать на основной теме почти никогда не бывает хорошо. – Mike

1

просто сделать окно сна в течение нескольких секунд в методе applicationDidFininshLaunchings

пример: сон (3)

11

Да, самый простой способ (не забудьте добавить «Default.png» для целей -> [ yourProjectName]: запуск изображения в 'Xcode'):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [NSThread sleepForTimeInterval:3.0]; 
} 
1

Согласно Apple, HIG вы не должны делать это.Но если ваше приложение должно сделать это для определенной цели, вы можете сделать:

  • импорта <unistd.h> в вашем AppDelegate.m
  • Написать следующую строку в первом из «didFinishLaunchingWithOptions приложений: "метод

    sleep(//your time in sec goes here//);

14

Несмотря на то, что против руководства, но если вы все еще хотите сделать это, чем лучший подход, а не спать нить будет

//Extend the splash screen for 3 seconds. 
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]]; 

Таким образом, основной поток не блокируется, и если он слушает любые уведомления и некоторые другие связанные с сетью вещи, они все еще продолжаются.

ОБНОВЛЕНИЕ ДЛЯ СВИФТ:

NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow:3)) 
+0

Можете ли вы рассказать, как реализовать это быстро. Я искал 2 часа. все еще не в состоянии понять это. –

+0

@SarthakMajithia см. Обновленный ответ –

+0

У вас есть ссылка на цитату из рекомендаций? – DeveloperACE

2
Inside your AppDelegate.m 

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    { 
     // Sleep is code to stop the slash screen for 5MoreSeconds 
     sleep(5); 

     [self initializeStoryBoardBasedOnScreenSize]; 
     return YES; 
    } 

// VKJ

0

То, что я представлен контроллер modalview на начальном экране, а затем dissmiss его через несколько секунд

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    .... 
    saSplash = [storyboard instantiateViewControllerWithIdentifier:@"SASplashViewController"]; 
    saSplash.modalPresentationStyle = UIModalPresentationFullScreen; 
    [self presentModalViewController: saSplash animated:NO]; 
} 

-(void) dismissSASplash { 
    [saSplash dismissModalViewControllerAnimated:NO]; 

} 
2

В Xcode 6.3 вы можете показать пусковую установку n.xib и даже поместив на него индикатор, сначала он покажет экран запуска по умолчанию, на котором он заменяется наконечником, поэтому пользователь не знает, что он изменился, а затем, если все загружено, скрыть его :-)

func showLaunchScreen() { 
    // show launchscreen 
    launchView = NSBundle.mainBundle().loadNibNamed("LaunchScreen", owner: self, options: nil)[0] as! UIView 
    launchView.frame = self.view.bounds; 
    self.view.addSubview(launchView) 

    // show indicator 
    launchScreenIndicator = UIActivityIndicatorView(frame: CGRectMake(0, 0, 50, 50)) as UIActivityIndicatorView 
    launchScreenIndicator.center = CGPointMake(self.view.center.x, self.view.center.y+100) 
    launchScreenIndicator.hidesWhenStopped = true 
    launchScreenIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray 
    launchView.addSubview(launchScreenIndicator) 
    self.view.addSubview(launchView) 
    launchScreenIndicator.startAnimating() 

    self.navigationController?.setNavigationBarHidden(self.navigationController?.navigationBarHidden == false, animated: true) //or animated: false 
} 

func removeLaunchScreen() { 
    println("remove launchscreen") 
    self.launchView.removeFromSuperview() 
    self.launchScreenIndicator.stopAnimating() 
    self.navigationController?.setNavigationBarHidden(false, animated: true) 
} 
0

Есть много вариантов уже размещены здесь, но я столкнулся с cocoapod сегодня, что позволяет отображать содержимое вашего LaunchScreen.xib в качестве исходного контроллера представления:

https://github.com/granoff/LaunchScreen (также смотрите blog post from the author with more implementation details.)

Это кажется как довольно прямолинейный способ сделать это, и лучше, чем подавляющее большинство ответов размещен здесь. (Конечно, это было невозможно до появления файлов LaunchScreen.) Наверху можно отобразить индикатор активности (или что-то еще, что вы хотите).

Что касается того, почему вы хотели бы это сделать, я удивлен, что никто не упомянул, что часто существуют требования к издателю и/или партнеру в отношении такого рода вещей. Это ОЧЕНЬ распространено в играх, но приложения, финансируемые рекламой.

Также обратите внимание, что это действует на счетчик HIG, но тогда он ждет загрузки любого содержимого после запуска приложения. Помните, что HIG - это рекомендации, а не требования.

Последнее замечание: Это мое личное мнение, что в любое время, когда начальный экран, подобный этому, реализован, вы должны иметь возможность использовать его, чтобы отклонить его.

0

Swift 2.0

Используйте следующую строку в didFinishLaunchingWithOptions: метод делегата:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    NSThread.sleepForTimeInterval(5.0) 
    return true 
} 

Но я рекомендую это:

Поместите изображение в UIImageView весь экран как подвид в верхней части вашей основной таким образом, охватывая ваш другой пользовательский интерфейс. Установите таймер, чтобы удалить его через несколько секунд (возможно, с эффектами), показывая ваше приложение.

import UIKit 
    class ViewController: UIViewController 
    { 
     var splashScreen:UIImageView! 
     override func viewDidLoad() 
     { 
      super.viewDidLoad() 
      self.splashScreen = UIImageView(frame: self.view.frame) 
      self.splashScreen.image = UIImage(named: "Logo.png") 
      self.view.addSubview(self.splashScreen) 

      var removeSplashScreen = NSTimer.scheduledTimerWithTimeInterval(3.0, target: self, selector: "removeSplashImage", userInfo: nil, repeats: false) 
     } 
     func removeSplashImage() 
     { 
      self.splashScreen.removeFromSuperview() 
     } 
    } 
0

При запуске приложения отображается изображение по умолчанию (default.png).

Итак, вы можете добавить новый диспетчер представлений, который отобразит это изображение по умолчанию в приложении didFinishLoading.

Итак, по этой логике вы покажите изображение по умолчанию немного дольше.

0

Swift версия:

Добавьте эту строку в AppDelegate

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    NSThread.sleepForTimeInterval(2.0)//in seconds 

    return true 
} 
1

Я сделал это, как показано ниже:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"LaunchScreen" bundle:nil]; 
    UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"splashView"]; 
    self.window.rootViewController = viewController; 

Примечание: LaunchScreen является запуск история Borad и splashView является раскадровкойIdentifier

Смежные вопросы