1.根据不同的设备类型设置不同的根控制器
//判断是否为iPhone设备
if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) { //iPhone
//如果为iPhone,设置SB中的tabBarVc为根控制器
//获取sb
UIStoryboard *mainSB = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
//从SB中取出tabBarVc
UITabBarController *tabBarVc = [mainSB instantiateViewControllerWithIdentifier:@"tabbar"];
//设置根控制器
self.window.rootViewController = tabBarVc;
}
iPad横竖屏适配-显示模式
1.设置splitVc的显示模式
self.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
/**
* splitVc的显示模式
UISplitViewControllerDisplayModeAutomatic, 自动,默认样式
UISplitViewControllerDisplayModePrimaryHidden, 主视图隐藏,横竖屏都只显示明细视图,可以通过手势来显隐主视图
UISplitViewControllerDisplayModeAllVisible, 横竖屏都显示主视图&明细视图,不可以通过手势来显隐主视图
UISplitViewControllerDisplayModePrimaryOverlay, 主视图覆盖,横竖屏都显示主视图&明细视图,可以通过手势来显隐主视图
*/
iPad横竖屏适配-主视图宽度
1.设置主视图宽度
1> 设置主视图的宽度比例(主视图宽度/splitVc的整体宽度) 受到最大&小值限制 不好确定具体数值
// self.preferredPrimaryColumnWidthFraction = 0.5;
2> 设置主视图宽度的最大值
self.maximumPrimaryColumnWidth = 60;
2.获取设备朝向
1> 监听设备朝向的变化的通知 UIDeviceOrientationDidChangeNotification 当设备朝向发生变化后调用响应方法
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil];
}
2> 主动获取设备朝向
2.1> 主动获取设备朝向 该方法有延迟,不能调用后立即获取设备朝向
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
2.2> 使用[UIDevice currentDevice].orientation来获取朝向
3.根据横竖屏情况设置不同的主视图宽度
根据横竖屏情况设置不同的主视图宽度
if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)) { //竖屏
//设置主视图宽度的最大值
self.maximumPrimaryColumnWidth = 60;
} else { //横屏
//设置主视图宽度的最大值
self.maximumPrimaryColumnWidth = 200;
}
多设备旋转适配
1.根据不同的设备类型设置应用不同的可支持朝向
//UIApplication一般处理和系统相关的工作,应用内的处理一般由其代理AppDelegate来完成
2.实现AppDelgate的协议方法,根据不同设备设置不同的支持方向
/**
* 当设置应用的可支持方向时调用
*
* application 应用对象
* window 窗口对象
*
* @return 需要设置可支持方向
*/
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
//根据不同的设备类型设置应用不同的可支持朝向
if (isPhone) { //iPhone
return UIInterfaceOrientationMaskPortrait;
} else { //iPad
return UIInterfaceOrientationMaskAll;
}
}
3.将设备判断抽取成宏,添加到pch中
#define isPhone ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) "注意宏中牵扯运算,需要添加()"
iOS9分屏适配
1.设置容器视图 目的是在分屏时在主视图上显示TabbarVc的视图内容
1> 在SB的主视图控制器上添加containerView
2> 连线tabBarVc 选择embed
3> 自定义主视图控制器,连线获取容器视图
4> 封装方法来控制容器视图的显隐
2.判断是否分屏
1.iPad分屏原则: 当iPad分屏时,会显示iPhone竖屏的样式(设置iPhone竖屏对应的SizeClass的样式)
2.判断是否分屏本质是判断SplitVc的SizeClass是否为iPhone竖屏的样式(width compact&height regular)
3.代码监听SizeClass
1> UIViewController这个基类遵守监听SizeClass的协议<UITraitEnvironment>
/**
*
@protocol UITraitEnvironment <NSObject> 监听SizeClass情况的
//该属性就可以获取对象的SizeClass情况
@property (nonatomic, readonly) UITraitCollection *traitCollection NS_AVAILABLE_IOS(8_0);
//当SizeClass发生变化后调用
- (void)traitCollectionDidChange:(nullable UITraitCollection *)previousTraitCollection NS_AVAILABLE_IOS(8_0);
*/
2> 实现监听SizeClass的协议方法,在其中判断SizeClass的情况
3> 获取主视图控制器 splitVc的viewControllers属性可以获取主视图&明细视图控制器,该属性中最多包含两个元素,[0]获取主视图控制器,[1]为明细视图控制器
CZMasterViewController *masterVc = self.viewControllers[0];
4> 根据分屏情况,调用主视图中控制容器视图显隐的方法
[masterVc showContainerView:showContainer];