ios 旋屏学习笔记-原
一, 使用uinavigationcontroller并添加rootview
如果使得所有的自视图都支持同样的旋转动作,比如四个方向的旋转,那么就可以逐个使用push的方法添加。而不用逐个设置,即便逐个设置也是没有效果的。
这个主要针对6.0,因为6.0之后都是以最top的controller旋转方式统一。即这种方法由uinavigationcontroller统
一。
二, 不使用push的方法,那么就需要为没有push的controller单独添加相应的方法来实现。这种情况适用于个别界面想采用不同的旋转方向或者不使用旋转。
// for 6.0
- (BOOL)shouldAutorotate
{
return YES;
}
// for 6.0
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskAll;
}
三, 为了兼容6.0之前的版本,需要在每个controller中书写其固定的方法
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
具体实现步骤:
1,appdelegate中实现如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after app launch.
self.rootView = [[ScrollPageController alloc]initWithNibName:@"ScrollPageController" bundle:nil];
// 这里注意,因为rootview最后是uinavigationcontroller,那么如果想控制scrollpagecontroller的旋转,那么必须子类化uinavigationcontroller,并在其中书写相应的方法。如果直接写在scroll里面是没有任何效果的!这个因为uinavigationcontroller此时才是真正的top view。可以书写uinavigationcontroller的类别的方式扩展这几个方法即可。这样之后所有的push的界面都不用重复写6.0相关实现旋屏的方法了,很简单。
self.navController = [[UINavigationController alloc]initWithRootViewController:self.rootView];
self.window.rootViewController = self.navController;
//以下屏蔽的地方其他人建议这样区分,但是发现5.0的无法正确设置rootview么有旋转的效果。有的说4.0以及以下的版本才需要这样设置,但是本地么有这个版本的模拟器无法验证!
// if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0){
// // warning: addSubView doesn't work on iOS6
// [self.window addSubview: navController.view];
// }
// else{
// // use this mehod on ios6
// [self.window setRootViewController:navController];
// }
// [self.window addSubview:self.navController.view];
[self.window makeKeyAndVisible];
return YES;
}
2,书写类别,扩展uinavigationcontroller相关的方法
//
// UINavigationController + Rotation.h
// AePubReader
//
// Created by Lisa Liu on 13-6-14.
//
//
@interface UINavigationController (Rotation)
@end
//
// UINavigationController + Rotation.m
// AePubReader
//
// Created by Lisa Liu on 13-6-14.
//
//
#import "UINavigationController + Rotation.h"
@implementation UINavigationController (Rotation)
// for 6.0
- (BOOL)shouldAutorotate
{
return YES;
}
// for 6.0
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskAll;
}
// for 6.0 below
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
@end
3,在其后每个controller中书写兼容6.0以下版本的方法并为每一个不使用push方法的controller加写6.0方法
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskAll;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
4,在info.plist文件中确保设置上了所有的方向。然后代码中实现返回支持所有的方向,否则还是只有默认的三个方向的测试过了。
二, 不使用push的方法,那么就需要为没有push的controller单独添加相应的方法来实现。这种情况适用于个别界面想采用不同的旋转方向或者不使用旋转。
// for 6.0
- (BOOL)shouldAutorotate
{
return YES;
}
// for 6.0
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskAll;
}
三, 为了兼容6.0之前的版本,需要在每个controller中书写其固定的方法
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
具体实现步骤:
1,appdelegate中实现如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after app launch.
self.rootView = [[ScrollPageController alloc]initWithNibName:@"ScrollPageController" bundle:nil];
// 这里注意,因为rootview最后是uinavigationcontroller,那么如果想控制scrollpagecontroller的旋转,那么必须子类化uinavigationcontroller,并在其中书写相应的方法。如果直接写在scroll里面是没有任何效果的!这个因为uinavigationcontroller此时才是真正的top view。可以书写uinavigationcontroller的类别的方式扩展这几个方法即可。这样之后所有的push的界面都不用重复写6.0相关实现旋屏的方法了,很简单。
self.navController = [[UINavigationController alloc]initWithRootViewController:self.rootView];
self.window.rootViewController = self.navController;
//以下屏蔽的地方其他人建议这样区分,但是发现5.0的无法正确设置rootview么有旋转的效果。有的说4.0以及以下的版本才需要这样设置,但是本地么有这个版本的模拟器无法验证!
// if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0){
// // warning: addSubView doesn't work on iOS6
// [self.window addSubview: navController.view];
// }
// else{
// // use this mehod on ios6
// [self.window setRootViewController:navController];
// }
// [self.window addSubview:self.navController.view];
[self.window makeKeyAndVisible];
return YES;
}
2,书写类别,扩展uinavigationcontroller相关的方法
//
// UINavigationController + Rotation.h
// AePubReader
//
// Created by Lisa Liu on 13-6-14.
//
//
@interface UINavigationController (Rotation)
@end
//
// UINavigationController + Rotation.m
// AePubReader
//
// Created by Lisa Liu on 13-6-14.
//
//
#import "UINavigationController + Rotation.h"
@implementation UINavigationController (Rotation)
// for 6.0
- (BOOL)shouldAutorotate
{
return YES;
}
// for 6.0
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskAll;
}
// for 6.0 below
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
@end
3,在其后每个controller中书写兼容6.0以下版本的方法并为每一个不使用push方法的controller加写6.0方法
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskAll;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
4,在info.plist文件中确保设置上了所有的方向。然后代码中实现返回支持所有的方向,否则还是只有默认的三个方向的测试过了。