2010-09-06 6 views

ответ

5

Вы можете скрыть элементы управления воспроизведением и добавлять свои собственные, то для этого будет предотвратить кнопки по умолчанию, оказываемые на всех

Ie с

[player setMovieControlMode:MPMovieControlModeNone]; 
7

В зависимости от ваших потребностей, вы можете просто отключить все пользовательские взаимодействия в режиме просмотра плеера.

player.view.userInteractionEnabled = NO; 
2

Проводной. Для видеороликов, которые начинаются в полноэкранном режиме, у них есть стандартные элементы управления MPMoviePlayerController, но отсутствуют полноэкранные кнопки. И они используют стандартные встроенные, так как у них внезапно появилась кнопка AirPlay с 4.2.

4

Там же обманщик:

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

Основной улов, вы должны сделать это в viewDidAppear: или подобное, потому что вид MoviePlayer ставит себя где-то внутри didMoveToWindow или didMoveToSuperview, которые происходят после viewWillAppear:. Таким образом, вы получаете кратковременную вспышку полноэкранной кнопки. Другие очевидные уловы включают в себя: хрупкий против Apple, изменяющий значение тега 512 (хотя он работает в 3.2 - 4.2); и, конечно, Apple предпочел бы, чтобы вы этого не делали.

Подтвержденное решение заключается в том, чтобы установить стиль управления на MPMovieControlStyleNone и свернуть свои собственные средства управления транспортом, что больше работает.

+1

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

+0

и попытаться удалить жесты – SAKrisT

+1

Apple, скорее всего, отклонит ваше приложение, если вы попытаетесь изменить MPMovePlayerController за публичным API. Вот цитата из [Документов Apple] (https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPMoviePlayerController_Class/Reference/Reference.html): «Подумайте, что просмотр фильма считается непрозрачным Структура. Вы можете добавить свои собственные подзаголовки в контент слоя поверх фильма, но вы ** никогда не должны изменять какие-либо из его существующих подзонов. ** « – n8tr

11

Просто сделал это:

- (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

Приятная идея, я думал, что могу использовать это, чтобы вызвать предупреждение, чтобы объяснить, почему полноэкранный режим не разрешался в текущем контексте и заставлял его оставаться во встроенном режиме. К сожалению, что на самом деле происходит, так это то, что вы все равно получаете переход на полный экран, а затем он возвращается к встроенному, который выглядит очень ужасно. – Roger

+0

Я просто пытался это сделать, но, к сожалению, полноэкранный режим игнорирует MPMovieControlStyleEmbedded и использует FullScreen, который, когда я переключаю полноэкранный режим, тогда он становится еще больше :( – lordB8r

2

Полноэкранной кнопка вместе с кнопкой паузы может быть удалена.

[self.videoPlayer setControlStyle:MPMovieControlStyleNone]; 
3

для того, чтобы отключить переключатель в полноэкранном режиме, либо форма кнопки или защемления жест, вы можете использовать это:

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

Я знаю, это немного устарела, но в любом случае. Я провел некоторое исследование в этом направлении и, похоже, нашел ответ. Я не знаю, почему он работает, но это так.

-(void) playMovieAtURL: (NSURL*) theURL { 

    MPMoviePlayerController* theMovie = 
    [[MPMoviePlayerController alloc] initWithContentURL: theURL]; 
    //That line is for ARC. Without it, it may not work. 
    self.moviePlayer = theMovie; 
    theMovie.scalingMode = MPMovieScalingModeAspectFill; 
    theMovie.controlStyle = MPMovieControlStyleFullscreen; 
    theMovie.repeatMode = MPMovieRepeatModeOne; 
    //Here you'd better use your custom ViewController subclass, if you want autorotating and all that stuff. 
    UIViewController * vc = [UIViewController new]; 
    [vc.view addSubview:theMovie.view]; 
    theMovie.fullscreen = YES; 
    theMovie.view.frame = vc.view.bounds; 
    vc.view = theMovie.view; 
    [self presentModalViewController:vc animated:YES]; 
    theMovie.fullscreen = YES; 

    [theMovie prepareToPlay]; 
    [theMovie play]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 
} 

// Когда фильм сделан, отпустите контроллер.

-(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

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

- (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

Простого блок для удаления щепотки зума здесь

Надежда это поможет

он работает со мной на iOS6

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

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

Вы можете установить controlStyle для полноэкранного режима. эти элементы управления несколько отличаются, но в нем нет полноэкранной кнопки!

[_moviePlayerController setControlStyle:MPMovieControlStyleFullscreen]; 
+0

Genius! Это, безусловно, лучший ответ. – PICyourBrain

2

Это работало на 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; 
    } 
} 

Обратите внимание, что я слушаю только «DID», а не «ВОЛЯ» уведомление, а также работает он анимированный. Я думаю, что это работает, поскольку это дает системному времени реагировать. Когда я использовал «WILL» и «DID», как указано в ответах выше, это привело к черному экрану без контроля. Есть небольшой сбой, который виден при переходе, но мне нужны кнопки воспроизведения/скраба из встроенного.

5

К сожалению, ни один из выше не работает для меня правильно, поэтому выбор выше я реализовал следующие (и работал отлично):

  1. Скрыть кнопку полного экрана.

Добавить этот код в том виде, в котором вы инициализируете проигрывателя.

 

    .... 

     //Because we have to wait until controllers are shown 

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

    ... 

Добавить методы:

 

    -(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; 

      } 

     } 

    } 

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

  1. Перезаписывать жесты для переноса, не позволяя полноэкранный зум.
 

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]; 

и добавить методы селекторные:

 

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

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

+0

Первое решение идеально подойдет для меня, thx! Внизу версия Swift – diegomen

+0

скрывает скруббер не кнопку полного экрана –

0

Помещенный UIView или UIButton с прозрачным фоном на верхней части представления, которая показывает видео, так что пользователь не сможет нажмите на вид, содержащий видео.

1

Это Swift версия первого решения Хавьер Калатравы 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 
     } 
    } 
} 

И когда пользователь нажимает на Play:

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

(VideoViewController является контроллер представления, в котором у меня есть MPMoviePlayerController)

Смежные вопросы