Изменить ориентацию интерфейса при нажатии кнопки назад

Мое приложение принимает только книжную ориентацию, кроме MPMoviePlayerController, который я хочу, чтобы пользователь мог изменить ориентацию.

Итак, я подкласс UINavigationController и добавил следующий код:

-(BOOL)shouldAutorotate
{
    if ([[[self.viewControllers lastObject] presentedViewController] isKindOfClass:[MPMoviePlayerViewController class]])
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

Это прекрасно работает, позволяя только мой MPMoviePlayerViewController изменить ориентацию. Проблема в том, что когда пользователь находится в альбомной ориентации и нажимает done Кнопка или воспроизведение заканчивается, он выскакивает moviePlayer и возвращается к представлению ViewController, но в ландшафтном режиме, вызывающем сбой, поскольку этот вид не предназначен для альбомной ориентации.

Я попробовал несколько вещей, чтобы вернуться Portrait но не повезло. Я использую раскадровки, если это что-то меняет. Я хотел бы изменить ориентацию обратно на портрет на viewWillAppearили, может быть, получить doneнажмите кнопку и измените ориентацию там.

ОБНОВИТЬ:

Вот обновленный код в моем UINavigationControllerподкласс:

-(BOOL)shouldAutorotate
{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    if ([[[self.viewControllers lastObject] presentedViewController] isKindOfClass:[MPMoviePlayerViewController class]])
    {
        return UIInterfaceOrientationMaskAll;
    }
    else
    {
        return UIInterfaceOrientationMaskPortrait;
    }
}

Теперь, если я делаю вещи в следующем порядке из представления с Play button,

  1. Поверните устройство. (он вызывает метод, но экран не вращается, так как он не MPMoviePlayerController учебный класс)
  2. Нажмите на игру button, (Он представляет игрока уже в ландшафтном режиме).
  3. Нажмите кнопку назад. (Выскакивает плеер и корректно показывает вид в портретном режиме)

Теперь, если я изменю порядок на:

  1. Нажмите кнопку воспроизведения. (удерживая устройство в штатном портретном положении).
  2. Поверните устройство. (он вращает проигрыватель фильма правильно, показывая видео).
  3. Нажмите кнопку назад. (он выскакивает из плеера, но на этот раз вид находится в ландшафтном режиме, что не соответствует ожидаемому поведению)

3 ответа

Решение

Нашел решение здесь по этому ответу.

При нажатии кнопки я добавил уведомление, а затем по нажатию кнопки "Готово" использовал приведенный ниже код для изменения ориентации. Я держал UINavigationController подкласс, как в моем вопросе, чтобы разрешить изменение ориентации, когда фильм начинает играть.

- (IBAction)playButton:(id)sender {        
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(moviePlaybackDidFinish)
                                                 name:MPMoviePlayerPlaybackDidFinishNotification
                                               object:self.player.moviePlayer];

    NSURL *url = [NSURL URLWithString:@"https://dl.dropboxusercontent.com/s/crzu6yrwt35tgej/flexao.mp4"];        
    self.player = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
    self.player.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
    [self presentMoviePlayerViewControllerAnimated:self.player]; // presentMoviePlayerViewControllerAnimated:self.player];
}

-(void)moviePlaybackDidFinish
{
    [[UIDevice currentDevice] setValue:
     [NSNumber numberWithInteger: UIInterfaceOrientationPortrait]
                                forKey:@"orientation"];
}

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

Вам нужен подкласс UINavigationController, как у вас уже есть, но со следующим кодом:

Файл.h:

@interface EECNavigationController : UINavigationController

@property (assign, nonatomic) BOOL landscapeDisallowed;

@end

.M файл:

#import "EECNavigationController.h"

@implementation EECNavigationController

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    if( !_landscapeDisallowed ) {
        // for iPhone, you could also return UIInterfaceOrientationMaskAllButUpsideDown
        return UIInterfaceOrientationMaskAll;
    }
    return UIInterfaceOrientationMaskPortrait;
}

@end

Теперь в контроллерах представления, которые будут находиться под этим навигационным контроллером, который вы хотите использовать только в качестве портрета, вам просто нужно установить "landscapeDisallowed" в YES в методе viewDidLoad, например:

- (void)viewDidLoad {
    [super viewDidLoad];

    ((EECNavigationController *)self.navigationController).landscapeDisallowed = YES;
}

И переопределите следующие методы, как это:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return toInterfaceOrientation == UIInterfaceOrientationPortrait;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

Представления, которые могут быть представлены в ландшафтном режиме, просто необходимо:

- (void)viewDidLoad {
    [super viewDidLoad];

    ((EECNavigationController *)self.navigationController).landscapeDisallowed = NO;
}

Это работает для меня, надеюсь, это работает для вас.

-(void)viewWillAppear:(BOOL)animated
{


       [self updateLayoutForNewOrientation:self.interfaceOrientation];
}
- (void)updateLayoutForNewOrientation:(UIInterfaceOrientation)orientation
{
    if (self.interfaceOrientation == UIInterfaceOrientationPortrait || self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        // Portrait view

        if(iPhone5)

        {
        }else{

        }

        if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
        {

        }


    }

    else
    {
        // Landscape view

        if(iPhone5)

        {


        }else{
            float SystemVersion=[[[UIDevice currentDevice] systemVersion] floatValue];
            if(SystemVersion>=7.0f)
            {


            }else{

            }
        }

        if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
        {
            if(iPhone5)
            {

            }
            else
            {

            }
        }


    }
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
    [self updateLayoutForNewOrientation:self.interfaceOrientation];
}

Надеюсь, это поможет

Другие вопросы по тегам