2010-09-06 16 views

Odpowiedz

5

Można ukryć elementy sterujące odtwarzaniem i dodawać własne niestandardowe te, to zapobiec przyciski domyślne są renderowane w ogóle

Ie z

[player setMovieControlMode:MPMovieControlModeNone]; 
7

W zależności od potrzeb, można też po prostu wyłączyć wszystkie interakcje użytkownika w widoku odtwarzacza.

player.view.userInteractionEnabled = NO; 
2

Wired to robi. Filmy, które rozpoczynają się w trybie pełnoekranowym, mają standardowe kontrolki MPMoviePlayerController, ale brakuje im przycisków pełnoekranowych. I używają standardowych wbudowanych, ponieważ nagle dostali przycisk AirPlay z 4.2.

4

Jest oszustem:

MPMoviePlayerController *mpc = (...some instance...) 
UIView *fsbutton = [[mpc view] viewWithTag:512]; 
[fsbutton setHidden:YES]; 

Głównym połów jest, trzeba to zrobić w viewDidAppear: lub podobny, ponieważ widok movieplayer ustawia się gdzieś wewnątrz didMoveToWindow lub didMoveToSuperview, który nastąpi po viewWillAppear:. Otrzymujesz krótki błysk przycisku pełnoekranowego. Inne oczywiste połowy to: kruche kontra Apple zmieniające tę wartość 512 (chociaż działa w wersjach 3.2 - 4.2); i oczywiście Apple wolałby, żebyś tego nie robił.

Zatwierdzonym rozwiązaniem jest ustawienie stylu sterowania na MPMovieControlStyleNone i przetasowanie własnych elementów sterujących transportem, co oznacza więcej pracy.

+1

Innym problemem jest to, że gest uszczypnięcia i powiększenia, który przenosi użytkownika na pełny ekran, omija ten pomysł. – Roger

+0

i spróbuj usunąć gesty. – SAKrisT

+1

Apple prawdopodobnie odrzuci twoją aplikację, jeśli spróbujesz zmodyfikować MPMovePlayerController poza publicznym API. Oto cytat z [dokumentów Apple'a] (https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPMoviePlayerController_Class/Reference/Reference.html): "Rozważ widok odtwarzacza filmów jako nieprzezroczysty Możesz dodać własne niestandardowe widoki do zawartości warstwy na górze filmu, ale ** nigdy nie wolno modyfikować żadnego z istniejących podrzędnych widoków. ** " – n8tr

11

Właśnie to zrobił:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(movieEventFullscreenHandler:) 
               name:MPMoviePlayerWillEnterFullscreenNotification 
               object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(movieEventFullscreenHandler:) 
               name:MPMoviePlayerDidEnterFullscreenNotification 
               object:nil]; 

    self.moviePlayer.controlStyle = MPMovieControlStyleEmbedded; 
} 

- (void)movieEventFullscreenHandler:(NSNotification*)notification { 
    [self.moviePlayer setFullscreen:NO animated:NO]; 
    [self.moviePlayer setControlStyle:MPMovieControlStyleEmbedded]; 
} 
+4

Niezły pomysł, myślałem, że mogę go użyć, aby wywołać alert wyjaśniający, dlaczego tryb pełnoekranowy nie był dozwolony w bieżącym kontekście i zmusił go do pozostania w trybie wbudowanym. Niestety, tak naprawdę dzieje się tak, że nadal przechodzisz do trybu pełnoekranowego, a następnie powracasz do bycia osadzonym, co wygląda naprawdę okropnie. – Roger

+0

Po prostu próbowałem to zrobić, ale niestety, pełnoekranowy ignoruje MPMovieControlStyleEmbedded i używa FullScreen, który, gdy przełączam na pełny ekran, staje się jeszcze większy :( – lordB8r

2

Fullscreen przycisk wraz z przyciskiem pauzy mogą zostać usunięte.

[self.videoPlayer setControlStyle:MPMovieControlStyleNone]; 
3

w celu wyłączenia przełącznika w trybie pełnoekranowym, czy przycisk formularz lub gestu pinch, można użyć tego:

moviePlayer.controlStyle = MPMovieControlStyleNone; 
moviePlayer.view.userInteractionEnabled =NO; 
0

Wiem, że to trochę przestarzałe, ale w każdym razie. Zrobiłem badania w tym kierunku i wygląda na to, że znalazłem odpowiedź. Nie wiem, dlaczego to działa, ale tak jest.

// Po zakończeniu filmu zwolnij kontroler.

-(void) myMovieFinishedCallback: (NSNotification*) aNotification 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
    MPMoviePlayerController* theMovie = [aNotification object]; 
    [[NSNotificationCenter defaultCenter] 
removeObserver: self 
name: MPMoviePlayerPlaybackDidFinishNotification 
object: theMovie]; 
    [self.moviePlayer.view removeFromSuperview]; 
    self.moviePlayer = nil; 
    // Release the movie instance created in playMovieAtURL: 
} 
1

Jeśli tylko rzeczą, którą chcesz zrobić, to wyłączyć szczypta jechać na pełnym ekranie (tjzachować interakcję włączona i cokolwiek kontrola styl chcesz), można użyć tego:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    NSSet *set = [event allTouches]; 
    NSArray *arr = [set allObjects]; 
    for (int i = 0; i < arr.count; i++) { 
     UITouch *touch = (UITouch *) [arr objectAtIndex:i]; 

     NSArray *recognisers = touch.gestureRecognizers; 
     for (UIGestureRecognizer *recogniser in recognisers) { 
      if (recogniser.enabled && [recogniser isMemberOfClass:[UIPinchGestureRecognizer class]]) { 
       recogniser.enabled = NO; 
      } 
     } 
    } 
} 
2

prosty dom usunąć pinch zoom tutaj

nadzieję, że pomoże

pracować ze mną na iOS6

for (UIView *view in moviePlayer.view.subviews) { 

    for(UIPinchGestureRecognizer *pinch in view.gestureRecognizers){ 
    if([pinch isKindOfClass:[UIPinchGestureRecognizer class]]) 
     [view removeGestureRecognizer:pinch]; 
    } 
} 
6

Możesz ustawić parametr controlStyle na Pełny ekran. Te elementy sterujące są nieco inne, ale nie ma przycisku Pełny ekran!

[_moviePlayerController setControlStyle:MPMovieControlStyleFullscreen]; 
+0

Geniusz! To zdecydowanie najlepsza odpowiedź – PICyourBrain

2

To działało na iOS 7, iPhone 5s.

Add Notification: 

MPMoviePlayerDidEnterFullscreenNotification : @"moviePlayFullscreenNote:" 

- (void)moviePlayFullscreenNote:(NSNotification*)notification 
{ 
    if (notification.object == self.videoPlayer) 
    { 
     [self.videoPlayer setFullscreen:NO animated:YES]; 
     self.videoPlayer.controlStyle = MPMovieControlStyleEmbedded; 
    } 
} 

Zauważ, że tylko słucham powiadomienia "DID", a nie "WILL", a także uruchamiam animację. Myślę, że to działa, ponieważ daje czas systemowy na reakcję. Kiedy użyłem "WILL" i "DID", jak zaznaczono powyżej, doprowadziło to do czarnego ekranu bez kontroli. Występuje niewielki błąd, który jest widoczny podczas przejścia, ale potrzebuję wbudowanych przycisków odtwarzania/szorowania.

5

Niestety żaden z wyżej pracował dla mnie prawidłowo, więc wybranie powyższego I wdrożone następujące (i działało w porządku):

  1. Ukryj przycisk pełnego ekranu.

Dodaj ten kod w metodzie, w której uruchamiasz odtwarzacz filmów.

 

    .... 

     //Because we have to wait until controllers are shown 

     [self performSelector:@selector(hideFullscreenButton) withObject:self afterDelay:0.5]; 

    ... 

Dodaj metody:

 

    -(void) hideFullscreenButton{ 

     //Hide full screen mode button 

     [self hideFullscreenSubview:movieClip.view.subviews]; 

    } 



    -(void) hideFullscreenSubview:(NSArray*)arr{ 

     for(UIView *v in arr){ 

      if([v.subviews count]>0) 

       [self hideFullscreenSubview:v.subviews]; 

      else 

       NSLog(@"%@",v); 

      if(v.frame.origin.x==975){ 

       v.hidden=TRUE; 

      } 

     } 

    } 

Problem polega, że ​​nie ma tag określić, które zobaczyć trzeba ukryć. W moim przypadku ustalam to za pomocą współrzędnych widoku.

  1. Zastępuj gesty dotykiem, aby nie zezwalać na powiększenie pełnoekranowe.
 

movieClip.controlStyle = MPMovieControlStyleEmbedded;  

    //Disable tap for not allowing that video control set on a full screen mode. 
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget: self action:@selector(doSingleTap)]; 
    singleTap.numberOfTapsRequired = 1; 
    [movieClip.view addGestureRecognizer:singleTap]; 



    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget: self action:@selector(doDoubleTap)]; 
    doubleTap.numberOfTapsRequired = 2; 
    [movieClip.view addGestureRecognizer:doubleTap]; 
    [singleTap requireGestureRecognizerToFail:doubleTap]; 

i dodać metody selektora:

 

    -(void) doSingleTap{ 
     //DO NOTHING!!! 
    } 

    -(void) doDoubleTap{ 
     //DO NOTHING!!! 
    } 

+0

Pierwsze rozwiązanie sprawdziło się idealnie, Na dole wersja Swift – diegomen

+0

ukrywa skruber, a nie przycisk pełnego ekranu –

0

umieścić UIView lub UIButton z przezroczystym tle w górnej części widoku, który pokazuje wideo, dzięki czemu użytkownik nie będzie mógł dotknij widoku zawierającego wideo.

1

To Swift wersja pierwszego roztworu Javier Calatrava Llavería:

func hideFullScreenButton() { 
    self.hideFullScreenSubview((self.moviePlayerController?.view.subviews)!) 
} 

func hideFullScreenSubview(subviews: [UIView]) { 
    for view: UIView in subviews { 
     if view.subviews.count > 0 { 
      self.hideFullScreenSubview(view.subviews) 
     } 
     if view.frame.origin.x == 631 { 
      view.hidden = true 
     } 
    } 
} 

A gdy użytkownik kliknie Play:

self.performSelector(#selector(VideoViewController.hideFullScreenButton), withObject: self, afterDelay: 0.5) 

(VideoViewController jest kontroler widoku, w którym mam MPMoviePlayerController)