Переключение режима Iphone Landscape в режим Portraite при загрузке нового контроллера - PullRequest
4 голосов
/ 07 мая 2009

Мое приложение правильно запускается в ландшафтном режиме и прекрасно работает:

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{
    if(interfaceOrientation == UIInterfaceOrientationPortrait)
        return NO;
    if(interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft )
        return YES; 
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

И обновленный Info.plist с

UIInterfaceOrientation = UIInterfaceOrientationLandscapeRight

Теперь в моем главном контроллере я переключаю один ViewController на другой

characterController = [ [ CharacterController alloc ] init];
myCurrentViewController = characterController;
self.view =  myCurrentViewController.view ;

и загружается, но ориентация в портретном режиме. Если я потом повернул iPhone, он исправит его в альбомном режиме. Любые идеи, как сохранить альбомную ориентацию при загрузке нового viewController в мой mainController?

Ответы [ 7 ]

7 голосов
/ 13 мая 2009

Будьте очень осторожны с вашими self.view=otherVC.view подходами. UIViewController предназначен для управления одним представлением. Он не предназначен для замены своего вида (поэтому изменения ориентации не работают). Это имеет значение в таких случаях, как -didReceiveMemoryWarning, если ваш ViewController не отображается на экране. Он тихо сбросит свой вид, и когда он вернется на экран, перезагрузите вид из NIB (или перезапустите -loadView).

Ваш presentModalViewController: подход несколько лучше, хотя он работает не так, как модальное представление. Это по крайней мере позволяет каждому ViewController управлять своим собственным представлением. Как правило, вы бы использовали UITabBarController или UINavigationController здесь. Я полагаю, у вас есть причина, по которой вы этого избегаете.

Мое рекомендуемое решение этого вопроса - добавить UIView в представление вашего основного контроллера (в виде IBOutlet или в коде). Вы поменяете , что просмотр, а не поменять местами представление UIViewController. Я бы, вероятно, пошел дальше и подкласс UIViewController для обработки этого с методами, смоделированными после UITabBarController.

@interface RNSwappableViewController : UIViewController
{
    ...
}
@property(nonatomic, assign) id<RNSwappableViewControllerDelegate> delegate;
@property(nonatomic) NSUInteger selectedIndex;
@property(nonatomic, assign) UIViewController *selectedViewController
@property(nonatomic, copy) NSArray *viewControllers;
@end

@protocol RNSwappableViewControllerDelegate : NSObject
- (void)swappableViewController:(RNSwappableViewController *)swappableViewController didSelectViewController:(UIViewController *)viewController
@end
3 голосов
/ 10 января 2013

Я использовал рекомендуемый код. Стол действительно вращается. Тем не менее, заголовок все еще находится в нормальной книжной ориентации и положении. Как я могу изменить положение заголовка?

// Пользовательский вид, который вращает представление таблицы

- (void)viewDidAppear:(BOOL)animated
{
    self.view.transform = CGAffineTransformMakeRotation(-3.14 * (90) / 180.0);
    self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
    self.view.center = CGPointMake(160.0f, 240.0f);

}
1 голос
/ 11 мая 2009

Нашел другое решение:

[myCurrentViewController presentModalViewController: newController animated: NO];
1 голос
/ 07 мая 2009

Я думаю, вам нужно реализовать

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

в вашем CharacterController.

0 голосов
/ 15 марта 2011

У меня была точно такая же проблема, за исключением того, что я добавлял модал в UITableViewController. Я обнаружил, что это была только проблема, если он вызывался из viewDidLoad, так как модальное представление было представлено до того, как ориентация была подтверждена делегатом контроллера представления.

Так что я просто использовал вызов executeSelector с таймером, вызываемым из viewDidLoad. Теперь он загружается в правильной ориентации.

0 голосов
/ 28 октября 2009

Была ли у вас проблема, когда должен вызываться методAutorotateToInterfaceOrientation с UIInterfaceOrientationPortrait, начинающимся даже тогда, когда телефон был в горизонтальной ориентации?

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

Вот что у меня сработало в контроллере представления модального вида:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];

// if device orientation is one of these, don't care what our interface orientation is
if (deviceOrientation == UIDeviceOrientationUnknown && deviceOrientation == UIDeviceOrientationFaceUp && deviceOrientation == UIDeviceOrientationFaceDown)
  return YES;

// otherwise only return YES for the ui orientation matching the current device orientation
return (interfaceOrientation == deviceOrientation);
}
0 голосов
/ 07 мая 2009

Я снова нашел свой ответ. LOL

После загрузки нового ViewController

self.view =  myCurrentViewController.view;

Обновить контроллер для ориентации нового ViewController на альбомную

self.view.transform = CGAffineTransformMakeRotation(-3.14 * (90) / 180.0);
self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
self.view.center = CGPointMake(160.0f, 240.0f);
...