2010-11-23 2 views
7

Ho un UIWebview all'interno di un UIScrollView. All'interno della webview ho un filmato di YouTube incorporato. Quando suono il film di YouTube, tutto funziona, tuttavia, quando premo il pulsante a schermo intero, il film inizia a giocare dietro la webview. Portare la WebView in primo piano non funziona, perché voglio che le funzionalità di scorrimento di ScrollView eseguano lo scorrimento orizzontale.SDK per iPad: il film YouTube incorporato riproduce la versione a schermo intero dietro UIWebView

+0

Perché hai una webview all'interno di una scrollview? Un UIWebView implementa il proprio comportamento di scorrimento.Inoltre, a seconda di come si collegano i delegati, è possibile ottenere un comportamento strano in "UIScrollViewDelegate" che UIWebView e UIScrollView implementano. Quindi se dici sia la scrollview che la webview che la sua proprietà delegata dovrebbe puntare a te stesso (il tuo controller), allora ogni volta che la webview scorre, sparerà metodi come 'scrollViewDidScroll:' che sarà lo stesso metodo che viene generato quando la tua vista di scorrimento scorre e non la vista web. Sembra brutto per me. – jer

+0

Quello che voglio ottenere è che posso scorrere orizzontalmente attraverso diverse visioni web (dove ogni webview è una pagina di una rivista). Il comportamento di scorrimento delle visualizzazioni Web è disabilitato. Quindi c'è un modo per farlo meglio o puoi dirmi come posso ottenere il film di YouTube in primo piano? – user517153

risposta

12

In pratica, si desidera essere in grado di rilevare quando un film inizia a riprodurre a schermo intero e organizzare le visualizzazioni in modo appropriato. Quindi, quando termina la riproduzione a schermo intero, vuoi essere in grado di riportare le tue visualizzazioni a come sono.

Il problema è che non esiste un modo documentato per collegare o rilevare quando UIWebView attiva la riproduzione di video a schermo intero.

Ho detto "modo documentato", perché ci sono alcune notifiche che è possibile utilizzare per rilevare quando UIWebView attiva la riproduzione a schermo intero. Puoi semplicemente ascoltare per loro e riorganizzare le tue opinioni di conseguenza. Tuttavia, non lo raccomando necessariamente, perché non sono documentati e soggetti a modifiche (in effetti, hanno un errore di ortografia in loro fino a iOS 4.3, vedere le risposte di seguito).

// For iOS 4.3 and above: 
UIMoviePlayerControllerDidEnterFullscreenNotification 
UIMoviePlayerControllerDidExitFullscreenNotification 

// For iOS 4.2 and below: 
UIMoviePlayerControllerDidEnterFullcreenNotification 
UIMoviePlayerControllerDidExitFullcreenNotification // (note spelling mistake) 

trovare questi out è stato un po 'di dolore - ci sono in realtà molti più notifiche che vengono attivate quando un video di YouTube in un UIWebView viene riprodotto. Per trovarli è necessario eliminare un punto di interruzione su tutte le notifiche delle notifiche, quindi ispezionare manualmente le posizioni di memoria di tali notifiche per capire i loro nomi di stringhe. In realtà non penso che qualcuno li abbia tirati fuori prima, perché quando li google non ottengo nulla. Ma funzionano, prometti!

Spero di essere in grado di ricevere una notifica quando la riproduzione a schermo intero è inserita/uscita sarà utile, con l'enorme avvertimento che Apple potrebbe modificare questo comportamento non documentato in qualsiasi momento. La tua app non verrà rifiutata a titolo definitivo per il loro utilizzo (perché non stai chiamando metodi non documentati) e l'ho usata nelle app di spedizione. Ma non è ancora la migliore idea del mondo ... potrebbe essere l'unica opzione che hai però.

Modifica: per chiarire, in base al commento seguente: non sono costanti, quindi è necessario inserirle tra virgolette se si è registrati per le notifiche.

+0

Cosa devo #importare per farli funzionare? Sto usando Xcode 4 e ottengo un errore di compilazione (Uso dell'identificatore non dichiarato) – ageektrapped

+2

Hai bisogno di metterli tra virgolette, non sono costanti, come segue: 'addObserver: self selector: @selector (someSelector) nome: @ "UIMoviePlayerControllerDidEnterFullcreenNotification" oggetto: nil] '- spero che ti aiuti! – lxt

+1

Bernado ha fatto una buona presa - in 4.3 i nomi delle notifiche sono cambiati e ora sono scritti correttamente. – lxt

2

Volevo solo confermare che questo funziona dopo aver giocato con esso per un po '. È possibile ottenere l'accesso diretto alla vista in cui viene riprodotto il video. Si tratta di un metodo a blocchi per la registrazione della notifica e l'estrazione delle viste pertinenti.

Avviso: è necessario posticipare l'aggiunta di subviews e/o accedere alle subview interne di Apple per rimuovere la barra di navigazione per ulteriori personalizzazioni.

[[NSNotificationCenter defaultCenter] 
    addObserverForName:@"UIMoviePlayerControllerDidEnterFullcreenNotification" 
    object:nil 
    queue:nil 
    usingBlock:^(NSNotification *note){ 
      MPMoviePlayerController *theMovieController = [note object]; 
      UIView *theDestinationVideoView = [[note userInfo] 
      objectForKey:@"UIMoviePlayerControllerFullscreenViewUserInfoKey"]; 
}]; 
+0

Non riesco a far funzionare correttamente questo blocco, il blocco non viene mai attivato, è ancora valido in 4.0? – box86rowh

+0

OK, sembra che abbiano corretto il loro errore di ortografia, ora è: UIMoviePlayerControllerDidEnterFullscreenNotification – box86rowh

+0

Posso mettere in pausa il video a livello di programmazione mentre il video viene riprodotto a schermo intero in uiwebview? – g212gs

6

Per iOS 4.3 e versioni successive, Apple hanno cambiato i nomi di queste notifiche: UIMoviePlayerControllerDidEnterFullcreenNotification ora è UIMoviePlayerControllerDidEnterFullscreenNotification

UIMoviePlayerControllerDidExitFullcreenNotification ora è UIMoviePlayerControllerDidExitFullscreenNotification

Attenzione: Il termine "Fullscreen" è cambiato "A schermo intero".

Grazie!

+0

Ben chiazzato - Ho aggiornato la mia risposta per fare riferimento alla correzione. – lxt