Эмуляция заставки в iOS приложении - PullRequest
11 голосов
/ 13 августа 2011

ОК, в iOS очень мало вариантов для эмуляции заставки.Все, что мы можем сделать, это дождаться полной загрузки приложения, а затем создать Media Player и загрузить в него видео.

Я реализовал его с помощью следующего кода:

-(void) moviePlayBackDidFinish:(NSNotification*)notification
{
    NSLog(@"Intro video stopped");
    [mMoviePlayer release];
}

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    NSURL* mMovieURL;
    NSBundle *bundle = [NSBundle mainBundle];
    if(bundle != nil)
    {
        NSString *moviePath = [bundle pathForResource:@"intro" ofType:@"mp4"];
        if (moviePath)
        {
            mMovieURL = [NSURL fileURLWithPath:moviePath];
            [mMovieURL retain];
        }
    }

    mMoviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:mMovieURL];
    [mMovieURL release];

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(moviePlayBackDidFinish:) 
                                                 name:MPMoviePlayerPlaybackDidFinishNotification 
                                               object:mMoviePlayer];

    mMoviePlayer.controlStyle = MPMovieControlStyleNone;
    [mMoviePlayer.backgroundView addSubview:[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Splash/background.png"]] autorelease]];
    mMoviePlayer.scalingMode = MPMovieScalingModeFill;

    [window addSubview:mMoviePlayer.view];
    [mMoviePlayer setFullscreen:YES animated:NO];

    [window makeKeyAndVisible];
    [mMoviePlayer play];

<... other stuff ...>

}

Мое видео занимает всего 1 МБ,Но этот код делает что-то другое, чем я хотел бы видеть:

  1. Прежде всего пользователь может видеть статический экран-заставку в течение нескольких секунд;
  2. Затем появляется черный экран для1 или 2 секунды.Я думаю, это происходит из-за того, что медиа-плеер загружен.
  3. Видео начинает воспроизводиться.
  4. Основной интерфейс загружается.

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

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

Несколько слов оосновной вид: я пишу приложение для iPad, а основной вид состоит из нескольких подпредставлений с несколькими изображениями.Каждое изображение и каждое подпредставление в главном представлении загружает некоторые данные из веб-службы Интернета через ASIHTTPRequest lib.

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

Как заставить видео воспроизводиться до загрузки основного вида?А может я могу отложить загрузку основного XIB?

Ответы [ 3 ]

13 голосов
/ 13 августа 2011

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

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

  • Отображается заставка (статическое изображение).
  • Приложение загружено. Вы видите UIImageView, также показывающий заставку. Поверх него находится прозрачный видеоплеер.
  • Киноплеер, наконец, загрузил ход и начинает его воспроизводить.

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

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

Что касается отображения заставки в UIImageView: к сожалению, вам нужно проверить вращение интерфейса и загрузить изображение вручную , нет способа запросить, какой экран заставки был показан. Если вы поддерживаете только одну ориентацию интерфейса (опять же, во многих играх это делается), у вас, конечно, нет этой проблемы.

10 голосов
/ 04 июля 2012

Теперь есть лучшее решение, если вы используете UIViewControllers.

Вместо MPMoviePlayerController используйте MPMoviePlayerViewController.Вот пример кода, адаптированный из вопроса:

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    NSURL* mMovieURL;
    NSBundle *bundle = [NSBundle mainBundle];
    if(bundle != nil)
    {
        NSString *moviePath = [bundle pathForResource:@"intro" ofType:@"mp4"];
        if (moviePath)
        {
            mMovieURL = [NSURL fileURLWithPath:moviePath];
            [mMovieURL retain];
        }
    }

    mMoviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:mMovieURL];
    [mMovieURL release];
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(moviePlayBackDidFinish) 
                                                 name:MPMoviePlayerPlaybackDidFinishNotification 
                                               object:mMoviePlayer.moviePlayer];
    mMoviePlayer.moviePlayer.controlStyle = MPMovieControlStyleNone;
    [mMoviePlayer.moviePlayer.backgroundView  addSubview:[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SplashCopy.png"]] autorelease]];
    mMoviePlayer.moviePlayer.scalingMode = MPMovieScalingModeFill;
    [window.rootViewController.view addSubview:mMoviePlayer.moviePlayer.view];
    [mMoviePlayer.moviePlayer setFullscreen:YES animated:NO];
    [mMoviePlayer.moviePlayer play];

}

0 голосов
/ 19 декабря 2017

Эмуляция заставки в приложении iOS этот код для swift4.0

        var mMovieURL: URL?
        let bundle = Bundle.main
        if bundle != nil {
            let moviePath: String? = bundle.path(forResource: "intro", ofType: "mp4")
            if moviePath != nil {
                mMovieURL = URL(fileURLWithPath: moviePath ?? "")

            }
        }
        mMoviePlayer = MPMoviePlayerController(contentURL: mMovieURL!)
        NotificationCenter.default.addObserver(self, selector: #selector(self.moviePlayBackDidFinish), name: .MPMoviePlayerPlaybackDidFinish, object: mMoviePlayer)
        mMoviePlayer.controlStyle = .none
        mMoviePlayer.backgroundView.addSubview(UIImageView(image: UIImage(named: "Splash.png")))
        mMoviePlayer.scalingMode = .fill
        window?.addSubview(mMoviePlayer.view)
        // window?.rootViewController?.view.addSubview(mMoviePlayer.view)
        mMoviePlayer.setFullscreen(true, animated: false)
        window?.makeKeyAndVisible()
        mMoviePlayer.play()

        return true
     }

     @objc func moviePlayBackDidFinish(_ notification: Notification) {
         mMoviePlayer.view.removeFromSuperview()
     }
...