13

Voglio mostrare un MPMoviePlayerController in un controller di visualizzazione e consentire all'utente di passare a schermo intero con i controlli predefiniti, come l'app YouTube. Sto utilizzando il seguente codice in un esempio ridotto all'osso:MPMoviePlayerController fullscreen quirk in iPad

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.player = [[MPMoviePlayerController alloc] init]; 
    self.player.contentURL = theURL; 
    self.player.view.frame = self.viewForMovie.bounds; 
    self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
    [self.viewForMovie addSubview:player.view]; 
    [self.player play]; 
} 

Questo funziona bene fino a quando l'utente effettua l'intero schermo video, ruota il dispositivo e rubinetti sullo schermo. La barra di stato è mostrata nella posizione sbagliata, come mostrato nello screenshot qui sotto.

screenshot

sto lavorando con il modello Tab barra delle applicazioni per iPad. Ho solo aggiunto viewDidLoad sopra, le variabili di visualizzazione e un UIView in XIB per mostrare il lettore di film.

Cosa sto sbagliando?

+0

sto vivendo lo stesso problema. Ancora nessuna soluzione? – samvermette

+0

Anch'io. Qualcuno ha funzionato? – V1ru8

+0

Hai ricevuto una risposta? – Jingwei

risposta

2

Is shouldAutorotateToInterfaceOrientation: interfaceOrientation restituisce SÌ per tutti gli orientamenti supportati?

 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

Se hai fornito più del tuo codice sarebbe di aiuto.

+0

Sì. L'unico codice che ho aggiunto al progetto è viewDidLoad sopra e, naturalmente, viewForMovie in XIB. È l'applicazione predefinita Tab Bar per iPad. – hpique

1

stai utilizzando il generatore di interfacce per l'interfaccia utente? in tal caso, assicurati di impostare l'orientamento della vista su "panorama" nella finestra di ispezione degli attributi della vista.

+0

Ora non riesce nell'altro orientamento. – hpique

1

Aveva lo stesso problema, ho passato solo mezza giornata a sistemarlo. Con l'iPad in orientamento verticale, ogni volta che ho avviato un video utilizzando il codice di esempio (o qualsiasi altro che potessi trovare sulla rete), il video e la barra di controllo sono stati formattati per il ritratto e quindi in tutto il luogo sullo schermo.

In ogni caso, il seguente funziona per me.

/* Call the code like below: 
     int iLandscape; 
     if(newOrientation==UIInterfaceOrientationLandscapeLeft || newOrientation==UIInterfaceOrientationLandscapeRight) 
      iLandscape=1; 

     [self PlayVideo:iLandscape fullscreen:1] 
    */ 
     ////////////////////////////////////////////////////////////////////////// 
     - (void)PlayVideo:(int)iLandscape fullscreen:(int)iFullScreen 
     { 
      NSString *url = [[NSBundle mainBundle] pathForResource:@"myvideofile" ofType:@"m4v"]; 

     if(iFullScreen==0) 
     { 
      MPMoviePlayerController *player2 = 
       [[MPMoviePlayerController alloc] 
        initWithContentURL:[NSURL fileURLWithPath:url]]; 

      [[NSNotificationCenter defaultCenter] 
       addObserver:self 
        selector:@selector(movieFinishedCallback:) 
         name:MPMoviePlayerPlaybackDidFinishNotification 
        object:player2]; 

      //---play partial screen--- 
      player2.view.frame = CGRectMake(0, 0, m_iScreenWidth, m_iScreenHeight); 
      [self addSubview:player2.view]; 
      //---play movie--- 
      [player2 play]; 
     } 
     else 
     { 
      MPMoviePlayerViewController *playerViewController = [[MPMoviePlayerViewController alloc] 
       initWithContentURL:[NSURL fileURLWithPath:url]]; 

      [[NSNotificationCenter defaultCenter] 
       addObserver:self 
        selector:@selector(movieFinishedCallback:) 
         name:MPMoviePlayerPlaybackDidFinishNotification 
        object:[playerViewController moviePlayer]]; 

      if(iLandscape) 
      { 
       playerViewController.view.frame = CGRectMake(0, 0, m_iScreenWidth, m_iScreenHeight); 
      } 
      [self addSubview:playerViewController.view]; 
      //play movie 
      MPMoviePlayerController *player = [playerViewController moviePlayer]; 
      player.scalingMode=MPMovieScalingModeAspectFit; 
      [player play]; 
     } 
    } 


    ////////////////////////////////////////////////////////////////////////// 
    - (void) movieFinishedCallback:(NSNotification*) aNotification 
    { 
     MPMoviePlayerController *player = [aNotification object]; 
     [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player];  
     [player autorelease];  
     [player.view removeFromSuperview]; 
    } 
0

Hai risolto questo problema?

[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationPortrait animated:NO]; 

Questo codice potrebbe essere di aiuto.

3

Sì, sto riscontrando anche questo problema. Sembra essere sicuramente un bug nel MPMoviePlayerController stesso.

La soluzione che ho optato per nella mia richiesta è di solo correggere la barra di stato me stesso quando esco modalità a schermo intero:

- (void)playerDidExitFullscreen:(NSNotification *)notification { 
    MPMoviePlayerController *moviePlayer = (MPMoviePlayerController *) notification.object; 

    if (moviePlayer == self.player) { 
     UIApplication *app = [UIApplication sharedApplication]; 
     if (app.statusBarOrientation != self.interfaceOrientation) { 
      [app setStatusBarOrientation:self.interfaceOrientation animated:NO]; 
     } 
    } 
} 

Questo non risolve il problema, mentre in modalità a schermo intero, ma lo fa aggiustalo dopo.

nota, naturalmente, che la funzione deve essere aggiunta alla notifica:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerDidExitFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:nil]; 
0

trovato.

Aveva lo stesso problema - ecco cosa ho fatto. Suggerirei di aggiungere il codice al progetto uno alla volta per vedere esattamente come funziona.

Primo: ho messo le cose in modalità verticale.

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; 

Quindi ho spostato il film sulla barra di stato.Nota - questo presuppone che il video ha un rapporto di formato 4x3

theVideo = [[MPMoviePlayerController alloc] initWithContentURL: [NSURL fileURLWithPath : path]]; 
float aspectRatio = (3.0f/4.0f); 
float theMovieHeight = [self view].bounds.size.width * aspectRatio; 
[[theVideo view] setFrame:(CGRectMake(0, [self view].bounds.size.height - theMovieHeight, [self view].bounds.size.width, theMovieHeight))]; 

Poi, nel luogo in cui l'applicazione si avvia (nel mio progetto, è nella funzione didFinishLaunchingWithOptions) - in ogni caso, è sufficiente accedere al oggetto finestra.

float aspectRatio = (3.0f/4.0f); 
float theMovieHeight = self.window.bounds.size.width * aspectRatio; 
float theSpaceAboveTheMovie = self.window.bounds.size.height - theMovieHeight; 
float whereTheMovieShouldBeCentered = (self.window.bounds.size.height - theMovieHeight)/2; 

CGAffineTransform theTransform = CGAffineTransformMakeTranslation(0,0); 

theTransform = CGAffineTransformScale(theTransform, 1.0f/aspectRatio, 1.0f/aspectRatio); 
theTransform = CGAffineTransformTranslate(theTransform, -whereTheMovieShouldBeCentered, 0); 
theTransform = CGAffineTransformRotate(theTransform, M_PI/2); 
theTransform = CGAffineTransformTranslate(theTransform, 0, -theSpaceAboveTheMovie); 

[self.window setTransform:theTransform]; 

Ricordare che le trasformazioni affini vengono eseguite in ordine inverso. Quindi, se volete vedere quello che ogni trasformata sta facendo (vi consiglio si dovrebbe), commentare i primi tre

Qui si dovrebbe vedere la barra di film e lo stato centrato sulla pagina

// theTransform = CGAffineTransformScale(theTransform, 1.0f/aspectRatio, 1.0f/aspectRatio); 
// theTransform = CGAffineTransformTranslate(theTransform, -whereTheMovieShouldBeCentered, 0); 
// theTransform = CGAffineTransformRotate(theTransform, M_PI/2); 
    theTransform = CGAffineTransformTranslate(theTransform, 0, -theSpaceAboveTheMovie); 

Poi il primo due

Qui si dovrebbe vedere la barra di film e lo stato ruotato e non più centrato

// theTransform = CGAffineTransformScale(theTransform, 1.0f/aspectRatio, 1.0f/aspectRatio); 
// theTransform = CGAffineTransformTranslate(theTransform, -whereTheMovieShouldBeCentered, 0); 
    theTransform = CGAffineTransformRotate(theTransform, M_PI/2); 
    theTransform = CGAffineTransformTranslate(theTransform, 0, -theSpaceAboveTheMovie); 

Qui si dovrebbe vedere ruotata e centrata

// theTransform = CGAffineTransformScale(theTransform, 1.0f/aspectRatio, 1.0f/aspectRatio); 
    theTransform = CGAffineTransformTranslate(theTransform, -whereTheMovieShouldBeCentered, 0); 
    theTransform = CGAffineTransformRotate(theTransform, M_PI/2); 
    theTransform = CGAffineTransformTranslate(theTransform, 0, -theSpaceAboveTheMovie); 

E con loro tutto, è ruotato e fullscreen

È possibile scaricare il mio codice di esempio here.

0

Prova questa

- (void)willEnterFullscreen:(NSNotification*)notification { 
    NSLog(@"willEnterFullscreen"); 

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO]; 
    } 

- (void)enteredFullscreen:(NSNotification*)notification { 
    NSLog(@"enteredFullscreen"); 
} 

- (void)willExitFullscreen:(NSNotification*)notification { 
    NSLog(@"willExitFullscreen"); 

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; 


} 

- (void)exitedFullscreen:(NSNotification*)notification { 
    NSLog(@"exitedFullscreen"); 

    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
}