iOS 6–;在UINavigationController中强制UIViewController旋转

iOS 6–;在UINavigationController中强制UIViewController旋转,ios,cocoa-touch,ios6,Ios,Cocoa Touch,Ios6,我有一个UINavigationController,其中堆栈中的所有UIViewController都是纵向的,除了最后一个是横向的。我当前的实现显示了最后一个视图控制器,但我可以旋转到横向,不能旋转回纵向推送视图时,如何强制旋转到横向? MyUINavigationController子类: @interface RotationViewController : UINavigationController @end @implementation RotationViewControl

我有一个
UINavigationController
,其中堆栈中的所有
UIViewController
都是纵向的,除了最后一个是横向的。我当前的实现显示了最后一个视图控制器,但我可以旋转到横向,不能旋转回纵向推送视图时,如何强制旋转到横向?

My
UINavigationController
子类:

@interface RotationViewController : UINavigationController

@end

@implementation RotationViewController

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    if (self.topViewController.class == [LoadingViewController class])
    {
        return UIInterfaceOrientationMaskLandscape;
    }

    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    if (self.topViewController.class == [LoadingViewController class])
    {
        return UIInterfaceOrientationLandscapeLeft;
    }

    return UIInterfaceOrientationPortrait;
}

@end
我只需要横向视图的视图控制器:

@implementation LoadingViewController

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationLandscapeLeft;
}

@end

其他视图控制器不实现这些方法中的任何一种。

我有相同的条件。因此,您可以在应用程序中实现以下代码

- (void)viewDidAppear:(BOOL)animated
{ 
    [super viewDidAppear:animated];

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft animated:NO];
    CGAffineTransform landscapeTransform = CGAffineTransformMakeRotation(degreesToRadian(270));
    landscapeTransform = CGAffineTransformTranslate (landscapeTransform, 0.0, 0.0);
    [[self navigationController].view setTransform:landscapeTransform];
    self.navigationController.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
    self.navigationController.navigationBar.frame = CGRectMake(0.0, 20.0, 480, 44.0); 
} 

-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];   

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];
    CGAffineTransform landscapeTransform = CGAffineTransformMakeRotation(degreesToRadian(0));
    landscapeTransform = CGAffineTransformTranslate (landscapeTransform, 0.0, 0.0);
    [[self navigationController].view setTransform:landscapeTransform];
    self.navigationController.view.bounds = CGRectMake(0.0, 0.0, 320, 480);
    self.navigationController.navigationBar.frame = CGRectMake(0.0, 20.0, 320.0, 44.0);
}

#define degreesToRadian(X) (M_PI * (X)/180.0)
注:-

以上代码是为iphone实现的。因此,如果您将其用于ipad,请更改界限。

您不需要实现

- (BOOL)shouldAutorotate

- (NSUInteger)supportedInterfaceOrientations

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
视图控制器中的函数。。。。因此,请删除这些方法。…

检查问题并在那里查看答案,以获得您所需的项目示例

基本上,您需要在viewcontroller(要旋转的)中嵌入自定义导航控制器。在此自定义导航控制器中添加以下方法

- (NSUInteger)supportedInterfaceOrientations
{
    return self.topViewController.supportedInterfaceOrientations;
}
并添加到应旋转的视图控制器:

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
确保在项目中启用了纵向、横向右侧和横向左侧方向。然后,如果要阻止特定视图的某些方向,请执行以下操作:

– application:supportedInterfaceOrientationsForWindow:

它可以工作(我只需要从我的导航控制器支持的界面方向返回0),但我正在寻找一个如何在按下视图时触发自动旋转的答案。这个解决方案更像是一个技巧…非常适合重新调整屏幕方向!但由于某些原因,状态栏仍然位于顶部。当我重新定位设备以匹配屏幕时,状态栏会转到正确的位置,但当我返回到原始纵向时,屏幕会转到纵向。(所有这些都不受
支持的界面定向的存在/不存在的影响。)