如果你需要开启旋转
首先你需要开启旋转在info.plist点选(需要使用方向)
- Portrait
- Landscape Left
- Landscape Right
或者在AppDelegate中实现代理方法
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskPortraitUpsideDown;
}
系统提供的样式:无非是各种搭配一下和plist里的一样
typedef NS_OPTIONS(NSUInteger, UIInterfaceOrientationMask) {
UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait),
UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft),
UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight),
UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown),
UIInterfaceOrientationMaskLandscape = (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
UIInterfaceOrientationMaskAll = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown),
UIInterfaceOrientationMaskAllButUpsideDown = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
}
- 首先让我们来看看系统在程序的启动过程UIKit处理屏幕旋转的流程
当加速计检测到方向变化的时候,会发出 UIDeviceOrientationDidChangeNotification 通知,这样任何关心方向变化的view都可以通过注册该通知,在设备方向变化的时候做出相应的响应。UIKit帮助我们做了很多事情,方便我们完成屏幕旋转。UIKit的相应屏幕旋转的流程如下:
1、设备旋转的时候,UIKit接收到旋转事件。
2、UIKit通过AppDelegate通知当前程序的window。
3、Window会知会它的rootViewController,判断该view controller所支持的旋转方向,完成旋转。
4、如果存在弹出的view controller的话,系统则会根据弹出的view controller,来判断是否要进行旋转。
看了这么久你会发现,道理我都懂但是咋使用呢?
****NAV PushViewController 单独设置某页****
注 : 使用UINavigationController 父类实现不然子VC无效(原因就是在有UINavigationController的情况下rootViewController是UINavigationController)
父类实现方法,就可以让某个单独的VC获得效果:
- (BOOL)shouldAutorotate
{
//也可以用topViewController判断VC是否需要旋转
return self.topViewController.shouldAutorotate;
}
- (NSUInteger)supportedInterfaceOrientations
{
//也可以用topViewController判断VC支持的方向
return self.topViewController.supportedInterfaceOrientations;
}
****Tabbat PushViewController 单独设置某页****
- (BOOL)shouldAutorotate {
return [self.selectedViewController shouldAutorotate];
}
- (NSUInteger)supportedInterfaceOrientations {
return [self.selectedViewController supportedInterfaceOrientations];
}
tabbr+nav 需要同时设置才能生效
子类实现方法
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
//当前支持的旋转类型
return UIInterfaceOrientationMaskAllButUpsideDown;
}
- (BOOL)shouldAutorotate
{
// 是否支持旋转
return YES;
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
// 默认进去类型
return UIInterfaceOrientationPortrait;
}
PresentViewController 单独设置某页
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
// 是否支持旋转
return UIInterfaceOrientationMaskAllButUpsideDown;
}
-(BOOL)shouldAutorotate
{
// 是否支持旋转
return YES;
}
iOS屏幕旋转各类集锦(二)-单页部分旋转
***写的比较粗糙demo附上https://github.com/bloodspasm/ScreenRotation ***