2015-03-26 4 views
0

У меня есть место, где я разрешаю пользователям выбирать видео с UIImagePicker, которое затем воспроизводится через MPMoviePlayerViewController. Это прекрасно работает, за исключением случаев, когда нажата кнопка «Готово», это просто приостанавливает видео и не отменяет его из полноэкранного режима. Я был убежден, что поведение по умолчанию кнопки «Готово» - это отклонение видео, поэтому я не совсем уверен, что мешает ему это сделать, или что я могу изменить, чтобы это произошло. Вот мой текущий код, я пробовал несколько изменений, которые я запомню после кода.MPMoviePlayerViewController done button not working

NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 

if(CFStringCompare((CFStringRef) mediaType, kUTTypeMovie, 0) == kCFCompareEqualTo) 
{ 
    videoURL = [info objectForKey:UIImagePickerControllerMediaURL]; 
} 

moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:videoURL]; 
[moviePlayer.view setTranslatesAutoresizingMaskIntoConstraints:YES]; 
moviePlayer.moviePlayer.scalingMode = MPMovieScalingModeAspectFit; 

[self.view addSubview:moviePlayer.view]; 

- (void) moviePlayBackDidFinish:(NSNotification*)notification 
{ 
[[NSNotificationCenter defaultCenter] removeObserver:self 
               name:MPMoviePlayerDidExitFullscreenNotification 
               object:nil]; 

[moviePlayer.moviePlayer stop]; 
[moviePlayer.view removeFromSuperview]; 
} 

Я попытался изменить [self.view addSubview:moviePlayer.view]; к [self presentMoviePlayerViewControllerAnimated:];, но это просто не делать ничего. Я добавил пару различных вариантов:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(moviePlayBackDidFinish:) 
              name:MPMoviePlayerDidExitFullscreenNotification 
              object:moviePlayer]; 

с остальной частью кода инициализации, но это тоже не помогло.

Редактировать: Если видео разрешено продолжать играть до конца, оно также не отменяется, оно просто застряло с видеопроигрывателем в полноэкранном режиме.

ответ

0

При добавлении наблюдателя параметр объекта должен быть moviePlayer.moviePlayer, а не только moviePlayer.

MoviePlayer.moviePlayer (класс MPMoviePlayerController) - это тот, который отправляет уведомление, а не moviePlayer (класс MPMoviePlayerViewController).

Так это изменить:

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

к этому:

[[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(moviePlayBackDidFinish:) 
     name:MPMoviePlayerPlaybackDidFinishNotification moviePlayer.moviePlayer]; 
0

Для Swift 3, это работает для меня:

//register the observer 
override func viewDidLoad() { 
     super.viewDidLoad() 

     NotificationCenter.default.addObserver(self, selector: #selector(CameraSetupViewController.moviePlayerDoneButtonClicked), name: NSNotification.Name.MPMoviePlayerPlaybackDidFinish, object: nil) 

     moviePlayerPlay() 
} 

//moviePlayer play function 
func moviePlayerPlay() { 
    let url:NSURL = NSURL(string: "https://tendinsights.com/Video.mp4") 

    if let movieViewController = MPMoviePlayerViewController(contentURL: url as URL!) 
      self.presentMoviePlayerViewControllerAnimated(movieViewController) 
       movieViewController.moviePlayer.play()  
    } 
} 

//moviePlayer Done Button Pressed 
func moviePlayerDoneButtonClicked(_ notification: NSNotification) {   
    let reason = notification.userInfo?[MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] 

    if (MPMovieFinishReason(rawValue: reason as! Int) == MPMovieFinishReason.userExited) { 
     self.dismiss(animated: true, completion: nil) 
    } 
}