2012-04-12 85 views
1

当我的应用程序进入后台并返回时,模式视图关闭。为什么会发生这种情况?我试着暂停和关闭。我启用了ARC,如果它是一个有用的信息。MPMoviePlayerViewController退出后背景

MPMoviePlayerViewController * player = [[MPMoviePlayerViewController alloc] initWithContentURL:targetURL]; 
[player.moviePlayer prepareToPlay]; 
[self presentMoviePlayerViewControllerAnimated:player]; 
+0

我有同样的问题。你解决了吗? – zvjerka24 2012-09-21 09:21:30

+0

这里是解决方案http://stackoverflow.com/questions/8344877/mpmovieplayerviewcontroller-becomes-black-when-enters-background – zvjerka24 2012-09-21 11:18:03

回答

5

在跨越这种情况下,任何人都跌倒(像我一样之前,我发现我自己的解决方案),我是能够防止MPMoviePlayerViewController从退出时应用背景通过继承它,并删除它作为UIApplicationDidEnterBackgroundNotification观察员:

- (id)initWithContentURL:(NSURL *)contentURL { 

    self = [super initWithContentURL:contentURL]; 

    if (self){ 

     [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil]; 

    } 

    return self; 
} 
0

下面是完整的代码,可以帮助你

// Call this to start initialization and play movie 
-(void)prepareMoviePlayer:(NSURL *)moviePath 
{ 
    moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:moviePath]; 

    if ([[moviePlayerViewController moviePlayer] respondsToSelector:@selector(loadState)]) 
    { 
     [[moviePlayerViewController moviePlayer] setControlStyle:MPMovieControlStyleNone]; 
     [[moviePlayerViewController moviePlayer] setFullscreen:YES]; 
     [[moviePlayerViewController moviePlayer] prepareToPlay]; 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(moviePlayerLoadStateDidChange:) 
               name:MPMoviePlayerLoadStateDidChangeNotification 
               object:nil]; 
    } 
} 

- (void) addPlayer 
{ 
    [[[moviePlayerViewController moviePlayer] view] setFrame:self.view.bounds]; 
    [[self view] addSubview:[[moviePlayerViewController moviePlayer] view]]; 
} 

static NSTimeInterval t; 
// Call this on applicationWillResignActive 
-(void) pauseMovieInBackGround 
{ 
    [[moviePlayerViewController moviePlayer] pause]; 
    t = [[moviePlayerViewController moviePlayer] currentPlaybackTime]; 
    [moviePlayerViewController.view removeFromSuperview]; 
} 

// Call this on applicationWillEnterForeground 
-(void) resumeMovieInFrontGround 
{ 
    [self addPlayer]; 

    [[moviePlayerViewController moviePlayer] stop]; 
    [[moviePlayerViewController moviePlayer] setInitialPlaybackTime:t]; 
    [[moviePlayerViewController moviePlayer] play]; 
} 

-(void)moviePlayerLoadStateDidChange:(NSNotification *)notification 
{ 
    if([[moviePlayerViewController moviePlayer] loadState] != MPMovieLoadStateUnknown) 
    { 

     [[NSNotificationCenter defaultCenter] removeObserver:self 
               name:MPMoviePlayerLoadStateDidChangeNotification 
               object:nil]; 

     [self addPlayer]; 
     [[moviePlayerViewController moviePlayer] play]; 
    } 
} 

-(void)videoPlayBackDidFinish:(NSNotification*)notification 
{ 
    [self dismissMoviePlayerViewControllerAnimated]; 
} 
0

我碰到这个问题来了。
我试过ChrisH的回答,但直到我将removeObserver放入viewDidLoad()而不是init()时,它才适用于我。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
// Do any additional setup after loading the view. 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil]; 

} 

然后它工作。好好享受。

2

您不需要子类MPMoviePlayerViewController - 只需在创建MPMoviePlayerViewController实例后执行以下步骤。

[[NSNotificationCenter defaultCenter] removeObserver:self.moviePlayerViewController name:UIApplicationDidEnterBackgroundNotification object:nil]; 
相关问题