开发一个应用,有这样这些需求:
- 界面同时适配iphone和ipad
- 同时适配横竖屏
- ipad支持分屏(多任务)
- 支持横竖屏强制切换
新建一个工程,做如下配置。
设备方向选择所有方向。不要勾选Requires full screen,该选项用于控制该应用是否支持多任务。
iPhone和iPad 可以单独设置是否支持横竖屏
适配iphone和iPad
iPad 多任务 Spilt View & Size Class
- 避免使用UIScreen的bounds来处理App应该的展示区域,最好使用UIWindow的bounds来代替。
#define IS_IPAD (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad)
#define kScreenWidth [UIScreen mainScreen].bounds.size.width
#define kScreenHeight [UIScreen mainScreen].bounds.size.height
#define kWindowWidth (IS_IPAD ? [UIApplication sharedApplication].keyWindow.bounds.size.width : [UIScreen mainScreen].bounds.size.width)
#define kWindowHeight (IS_IPAD ? [UIApplication sharedApplication].keyWindow.bounds.size.height : [UIScreen mainScreen].bounds.size.height)
-
PS. 苹果要求LaunchScreen.storyboard中必须使用Autolayout布局,还在用全手写Launch布局的朋友们,该考虑切换到Auto Layout布局了
-
如何响应Window尺寸变化,当Window发生变化时会触发一下方法
可以在viewWillLayoutSubviews
中更新横屏、iPad布局
layoutSubviews 方法调用时机
• 这个方法一般是在view设置frame或者添加子视图的时候调用,而且每设置一次frame或者添加一个子视图的时候都会调用。
方法使用场景
• 这个方法一般是在封装控件的时候使用,当我们在封装一个控件的时候,内部可能会有多个子控件,这个时候设置子控件的frame的代码,要放在这个方法中来设置,因为这个方法可以监听到整个父视图的frame的改变。
使用注意点
• 在使用的时候一定要调用[super layOutSubviews]
- (void)viewWillLayoutSubviews {
NSLog(@"viewWillLayoutSubviews");
[super viewWillLayoutSubviews];
//判断是否是ipad设备
if (IS_IPAD) {
//分屏适配需要重新计算UI布局
_button.frame = CGRectMake(0, 64, kWindowWidth, 50);
。。。
}
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
NSLog(@"viewDidLayoutSubViews");
}
#pragma mark -
#pragma mark Size Class Related
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
{
[super traitCollectionDidChange:previousTraitCollection];
}
- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator];
}
// 屏幕size改变:方向变化、分屏
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
NSLog(@"viewWillTransitionToSize: size %@", NSStringFromCGSize(size));
}
总结:
无论采用自定义frame布局或者采用autolayout布局方式,在适配IPad分屏时,VC里都需要重写viewWillLayoutSubviews
,加一层ipad设备的判断,仅在ipad下重新进行UI布局和字体相关的设置。对于普通的UIView需要重写layoutSubviews
方法,在适配IPad分屏时,同样需要加一层ipad设备判断,仅在ipad下重新更新UI布局和字体设置
实现单个页面强制横屏
在VC.m 中这样写就实现横屏了。就这样简单
#pragma mark -- iOS实现单个页面强制横屏 --
// 其他页面的代码不用动,只需在需要横屏的页面实现下面几句代码即可
- (BOOL)shouldAutorotate
{
return NO;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationLandscapeRight;
}