IOS开发 - 屏幕旋转

来源:互联网 发布:淘宝属性词是什么 编辑:程序博客网 时间:2024/06/06 14:07

1,全局控制

你的应用是否支持屏幕旋转需要一个全局的配置,在 AppDelegate 中有这样一个方法,这个方法返回你的app支持屏幕旋转的全局配置,当某一个viewController要判断是否旋转自己的时候,会调用这个方法,根据这个方法的返回值决定是否可以进行屏幕旋转。 

If you do not implement this method,  the app uses the values in theUIInterfaceOrientation key of the app’sInfo.plist as the default interface orientations.

我们一般都是在Info.plist中来配置支持的屏幕旋转的方向的。

一般情况下,程序启动时候的方向是,plist中配置的第一个选项,所以,这里的第一个一般都是竖屏的。

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
Info.plist 设置 如图所示:




2,如果根控制器是Navi控制器,需要这样写:

//注意如果你window的rootViewController是一个navigationController,可能会出现以下问题://你的navigationController只支持竖屏,但是你push到了某个新的controller中,这个controller支持横竖屏,当你在新的controller中切换到横屏后(也有可能在切换到横屏然后pop回来后),这时候程序会闪退,因为你的navigationController不支持横屏。//如果你想解决这个问题,就需要自己写一个UINavigationController的子类,在这个类中重写以下方法:<p class="p1"></p>//返回当前正在显示的控制器是否支持屏幕旋转- (BOOL)shouldAutorotate{    return [self.viewControllers.lastObject shouldAutorotate];}<p class="p1"></p>// 返回当前正在显示的控制器支持的屏幕旋转方向- (NSUInteger)supportedInterfaceOrientations{    return [self.viewControllers.lastObject supportedInterfaceOrientations];}<p class="p1"></p>// 返回当前正在显示的控制器,最佳的屏幕方向- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{    return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation];}


3,在需要支持屏幕旋转的控制器中

// 判断这个viewController是否支持屏幕旋转- (BOOL)shouldAutorotate{    return YES;}// 设置手机屏幕支持旋转的方向- (NSUInteger)supportedInterfaceOrientations{    return UIInterfaceOrientationMaskPortrait |    UIInterfaceOrientationMaskLandscapeLeft |UIInterfaceOrientationMaskLandscapeRight;}// 手机支持屏幕旋转,并且屏幕已经旋转的时候,会调用这个方法,在这个方法里面,可以重新给view布局以适应不同的屏幕方向<pre name="code" class="objc">- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{    NSLog(@"横屏模式");    NSLog(@"%lf, %lf", ScreenWidth, ScreenHeight);        if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft)    {        NSLog(@"UIInterfaceOrientationLandscapeLeft");        realScreenWidth = ScreenSize.height;        realScreenHeight = ScreenSize.width;    }    else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)    {        NSLog(@"UIInterfaceOrientationLandscapeRight");        realScreenWidth = ScreenSize.height;        realScreenHeight = ScreenSize.width;    }    else if (toInterfaceOrientation == UIDeviceOrientationPortrait)    {        NSLog(@"UIDeviceOrientationPortrait");        realScreenWidth = ScreenSize.width;        realScreenHeight = ScreenSize.height;    }        [self reloadScroll];}



4,在所有控制器的父控制器中

写这两句是为了默认的让所有控制器不支持屏幕旋转,个别控制器需要支持屏幕旋转的时候,再重写这两个方法。

// 支持设备自动旋转- (BOOL)shouldAutorotate{    return NO;}// 支持竖屏显示- (NSUInteger)supportedInterfaceOrientations{    return UIInterfaceOrientationMaskPortrait;}


注意:

#define IMAGEXY (ScreenWidth - 6) / 4.0#define ScreenWidth [[UIScreen mainScreen] bounds].size.width#define ScreenHeight [[UIScreen mainScreen] bounds].size.height@implementation PublicDetailViewController//在iOS7下这个必须加上这个,不然会崩溃,说preferredInterfaceOrientationForPresentation must return a supported interface orientation!- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{    return UIInterfaceOrientationPortrait;}
//这个函数是说最佳的屏幕效果

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation


在我们实际的应用开发的过程中,一般不会所有的控制器都支持屏幕旋转,一般是某几个页面需要支持,通常我们的做法是,在plist中选定我们需要支持的屏幕旋转方向;在根控制器中设置控制器不支持屏幕旋转的方向,在需要支持屏幕旋转的控制器中,重写方法,返回支持屏幕旋转的方向。

IOS系统支持屏幕旋转的方式,当屏幕的物理方向放生改变的时候,APP会去AppDeledate中调用application:supportedInterfaceOrientationsForWindow: 这个方法,如果重写了这个方法,将会使用这个方法的返回值,如果没有重写,这个方法会去读取Info.plist中的配置信息得到App支持的屏幕旋转方向;当一个ViewController将要被显示出来的时候,会默认显示当前设备的物理方向,当屏幕旋转的时候,会调用viewController中的- (NSUInteger)supportedInterfaceOrientations这个方法,这个方法会返回本ViewController支持的屏幕方向,如果这个方法返回的屏幕方向和APP支持的屏幕方向没有重合的,那么程序将会崩溃。如果有,则会显示为重合的屏幕方向。



0 0
原创粉丝点击