1、首先在appDelegate中,把view添加到window中有两种方式、

self.window.rootViewController = self.view;
     [self.window addSubview:self.view.view];


但是如果用第二种的话,在ios6.0中 再去设置屏幕旋转是没有任何效果的,必须使用第一种。在ios6.0以前的版本是没有这种分别的。

2、 开启全部方向屏幕旋转的方式

iOS6.0之前: 只需这个方法返回yes即可

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

iOS6.0中  需要这三个方法一起使用才可以

 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
     {
        return (toInterfaceOrientation != UIInterfaceOrientationMaskPortraitUpsideDown);
     }
     - (BOOL)shouldAutorotate
     {
      return YES;
     }
     - (NSUInteger)supportedInterfaceOrientations
     {
      return UIInterfaceOrientationMaskAllButUpsideDown;
     }

当然了关闭全部方向屏幕旋转的方式则把上面的返回值改为no即可

iOS6.0之前:

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

 iOS6.0中

 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
     {
     return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
     }
     - (BOOL)shouldAutorotate
     {
     return NO;
     }
     - (NSUInteger)supportedInterfaceOrientations
     {
         return UIInterfaceOrientationMaskPortrait;//只支持这一个方向(正常的方向)
     }

使用屏幕旋转常用的方法

//视图旋转之前自动调用
 -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
     NSLog(@"视图旋转之前自动调用");
 }
 //视图旋转方向发生改变时会自动调用
 -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
 {
     NSLog(@"视图旋转方向发生改变时会自动调用");
 }
 //视图旋转完成之后会自动调用 -(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
     NSLog(@"视图旋转完成之后自动调用");
 }

如果是含有UINavigationController、UITabBarController的话,那么修改部分就多了。

用其派生类的,在派生类中增加上面的supportedInterfaceOrientations、shouldAutorotate函数。

下面如MyNavigationController就是UINavigationController 的派生类。
修改部分如下
1:在旧的程序中AppDelegate的部分如

定义的 UINavigationController *navigationController;


[window addSubview       :       [navigationController view       ]       ];         //不能旋转


改为
MyNavigationController *myNavigationController;


派生类主要部分为


#import "MyNavigationController.h"       

@interface MyNavigationController        (       )       

@end       

@implementation MyNavigationController       

-        (       id       )initWithNibName       :       (       NSString        *       )nibNameOrNil bundle       :       (       NSBundle        *       )nibBundleOrNil       
{       
     self        =        [super initWithNibName       :nibNameOrNil bundle       :nibBundleOrNil       ];       
            if        (self       )        {       
                // Custom initialization
            }       
            return self;       
}       

-        (       void       )viewDidLoad       
{       
            [super viewDidLoad       ];       
            // Do any additional setup after loading the view.
}       

-       (       BOOL       )shouldAutorotate       
{       
            return        [self.viewControllers.lastObject shouldAutorotate       ];       
}       

-       (NSUInteger       )supportedInterfaceOrientations       
{       
            return        [self.viewControllers.lastObject supportedInterfaceOrientations       ];       
}       

-       (UIInterfaceOrientation       )preferredInterfaceOrientationForPresentation       
{       
            return        [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation       ];       
}       

-        (       void       )didReceiveMemoryWarning       
{       
            [super didReceiveMemoryWarning       ];       
            // Dispose of any resources that can be recreated.
}       

@end


这样就能控制所有的控制画面中的旋转了,当然别忘了在每个控制画面都增加旋转的函数。
根据多篇文章改写的,目前根据这样的方式,能够解决自己目前的问题,

------------------------------------------------------



多次实验后总结出控制屏幕旋转支持方向的方法如下:


子类化UINavigationController,增加方法。


 


并且设定其为程序入口,或指定为 self.window.rootViewController


随后添加自己的view controller,如果想禁止某个view controller的旋屏:(支持全部版本的控制)



如果想又开启某个view controller的全部方向旋屏支持:


从而实现了对每个view controller的单独控制。


 


顺便提一下,如果整个应用所有view controller都不支持旋屏,那么干脆: