Iphone横向模式在加载新控制器时切换到纵向模式

时间:2009-05-07 17:26:56

标签: iphone uiviewcontroller orientation landscape

我的应用程序正确地以横向模式启动并且效果很好:

- (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 个答案:

答案 0 :(得分:7)

self.view=otherVC.view方法要非常小心。 UIViewController旨在管理单个视图。它的设计不是为了让它的视图换掉(这就是为什么你的方向改变不起作用)。如果您的ViewController不在屏幕上,则在-didReceiveMemoryWarning之类的情况下这很重要。它将悄悄地转储其视图,当它返回到屏幕上时,从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

答案 1 :(得分:3)

我使用了推荐的代码。实际上,该表确实是旋转的。但是标题栏仍然处于正常的纵向方向和位置。如何重新定位标题栏?

//自定义显示旋转tableview

- (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);

}

答案 2 :(得分:1)

我认为你需要实施

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

在你的CharacterController中。

答案 3 :(得分:1)

找到另一种解决方案:

[myCurrentViewController presentModalViewController: newController animated: NO];

答案 4 :(得分:0)

你有没有问题在哪里调用了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);
}

答案 5 :(得分:0)

我遇到了完全相同的问题,除了我将模态添加到UITableViewController。我发现这只是一个问题,如果它是从viewDidLoad调用的,因为模式是在视图控制器的委托确认方向之前呈现的。

所以我只使用了一个带有计时器的performSelector调用,从viewDidLoad调用。现在它以正确的方向加载。

答案 6 :(得分:-2)

我再次找到了自己的答案。 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);