2010-07-22 2 views
3

В iOS4 для iPhone 4/3GS у меня есть табличное представление, и одна из ячеек воспроизводит файл фильма. Если фильм заканчивается, и элементы управления исчезли, представление возвращается в строке состояния. Как на этом изображении ... что я слишком новичок в публикации. Посмотрите здесь ...Проблема MPMoviePlayerViewController после завершения фильма

http://www.dezignwright.com/ios4_movie.png

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

БОНУС: Как заставить плеер фильма играть в ландшафт, когда он начинает играть. Я не хочу, чтобы он вообще играл в портрете.

Спасибо.

ответ

0

Это, кажется, ошибка в 4.0, она работает правильно при выходе с помощью кнопки «Готово».

Обходной путь, который я использую, заключается в том, чтобы вручную сохранить фрейм, а затем восстановить его при получении MPMoviePlayerPlaybackDidFinishNotification.

Наконец, чтобы получить его в ландшафтном режиме, используйте подкласс MPMoviePlayerViewController, где вы переопределять shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation

Т.е. что-то вроде этого:

@interface CustomMoviePlayerViewController : MPMoviePlayerViewController 
@end 
@implementation CustomMoviePlayerViewController 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    return toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft; 
} 
@end 

И в контроллере, чтобы работать вокруг ошибки:

- (void)playbackEnded:(NSNotification *)notification 
{ 
    [[self view] setFrame:[self originalFrame]]; 
} 

- (void)playMovie:(NSString *)movieURLString 
{ 
    MPMoviePlayerViewController *controller = [[CustomMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:movieURLString]]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackEnded:) name:MPMoviePlayerPlaybackDidFinishNotification object:[controller moviePlayer]]; 
    [self presentMoviePlayerViewControllerAnimated:controller]; 
} 
+0

Спасибо !!! Я попробую. –

+0

Это сработало для вас? – Nuoji

+0

Посмотрите на мое решение, если у вас все еще есть проблема – Sid

0

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

-(IBAction)playMovieButtonPressed:(id)sender { 
    MPMoviePlayerViewController* playerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:[self localMovieURL]]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(playbackDidFinish:) 
      name:MPMoviePlayerPlaybackDidFinishNotification 
       object:playerViewController.moviePlayer]; 

[self setWantsFullScreenLayout:NO]; 
// this ensures that the original frame is restored correctly 
// if the movie ends and the player is closed automatically 

[self presentMoviePlayerViewControllerAnimated:playerViewController]; 
    [playerViewController release]; 
    MPMoviePlayerController *player = [playerViewController moviePlayer]; 
    [player play]; 
}
+0

Это не работает в сложной иерархии представлений. Проверьте это - http://stackoverflow.com/questions/3310909/mpmovieplayerviewcontroller-issue-after-movie-finishes/5738038#5738038 – Sid

0

Я была такая же проблема, и я использовал эту workaroud, чтобы исправить это:

-(void)myMovieFinishedCallback:(NSNotification*)aNotification 
{ 
    if (self.interfaceOrientation == UIInterfaceOrientationPortrait || self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
     CGRect frame = CGRectMake(0, 20, 768, 1004); 
     self.view.frame = frame; 
    }else { 
     CGRect frame = CGRectMake(0, 20, 1004, 768); 
     self.view.frame = frame; 
    } 
} 

Отрегулируйте Rect как размер экрана, мой код должен работать на iPad.

1

@Nuoji находится недалеко от правильного ответа. Кадр рассматриваемого вида анимируется iOS, когда MPMoviePlayerViewController отклоняется. Из-за ошибки в iOS, когда воспроизведение заканчивается автоматически (когда фильм заканчивается), анимация предполагает, что рассматриваемое представление занимает весь экран, когда это возможно.

Шаг 1. Сохраните кадр надзора, содержащий представление, которое запустит MPMoviePlayerViewController.

Шаг 2. Приложить слушатель для playbackDidFinishNotification

[[NSNotificationCenter defaultCenter] addObserver:self 
            selector:@selector(playbackDidFinish:) 
             name:MPMoviePlayerPlaybackDidFinishNotification 
            object:nil]; 

Шаг 3. В обработчике уведомлений сбросить кадр назад к оригиналу, но после задержки, чтобы позволить анимации закончить. Если кадр изменен во время анимации, он не действует.

[self performSelector:@selector(resetFrame) 
      withObject:nil 
      afterDelay:kResetFrameDelay]; 

- (void)resetFrame { 
    self.view.frame = kApplicationFrame; 
} 
1

Этот вопрос был рассмотрен и больше не является проблемой на iOS 4.3.

Спасибо за каждый вход.

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