(0102)iOS开发之iPad分屏多任务: Slide Over & Split View

开发一个应用,有这样这些需求:

  • 界面同时适配iphone和ipad
  • 同时适配横竖屏
  • ipad支持分屏(多任务)
  • 支持横竖屏强制切换

屏幕旋转及ipad分屏情形下的适配

新建一个工程,做如下配置。

在这里插入图片描述

设备方向选择所有方向。不要勾选Requires full screen,该选项用于控制该应用是否支持多任务。

iPhone和iPad 可以单独设置是否支持横竖屏
在这里插入图片描述

适配iphone和iPad

iPad 多任务 Spilt View & Size Class

  1. 避免使用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)


  1. PS. 苹果要求LaunchScreen.storyboard中必须使用Autolayout布局,还在用全手写Launch布局的朋友们,该考虑切换到Auto Layout布局了

  2. 如何响应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;
}

发布了249 篇原创文章 · 获赞 224 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/shifang07/article/details/99455054