Изменить ориентацию интерфейса при нажатии кнопки назад
Мое приложение принимает только книжную ориентацию, кроме 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
,
- Поверните устройство. (он вызывает метод, но экран не вращается, так как он не
MPMoviePlayerController
учебный класс) - Нажмите на игру
button
, (Он представляет игрока уже в ландшафтном режиме). - Нажмите кнопку назад. (Выскакивает плеер и корректно показывает вид в портретном режиме)
Теперь, если я изменю порядок на:
- Нажмите кнопку воспроизведения. (удерживая устройство в штатном портретном положении).
- Поверните устройство. (он вращает проигрыватель фильма правильно, показывая видео).
- Нажмите кнопку назад. (он выскакивает из плеера, но на этот раз вид находится в ландшафтном режиме, что не соответствует ожидаемому поведению)
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];
}
Надеюсь, это поможет