MPMoviePlayerViewController проблема после завершения фильма - PullRequest
3 голосов
/ 22 июля 2010

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

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

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

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

Спасибо.

Ответы [ 5 ]

1 голос
/ 21 апреля 2011

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

Спасибо за вводные комментарии.

1 голос
/ 21 апреля 2011

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

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

Шаг 2. Присоедините слушателя для воспроизведенияDinFinishNotification

[[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;
}
0 голосов
/ 23 ноября 2010

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

-(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 голосов
/ 10 февраля 2011

У меня была такая же проблема, и я использовал это 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.

0 голосов
/ 28 июля 2010

Это похоже на ошибку в 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...