iOS 适配iOS11+ 及 iPhone X系列

2017-12-29  本文已影响64人  _YZG_

官方文档 https://developer.apple.com/ios/human-interface-guidelines

一、一些判断

判断系统版本


方式一、
#ifdef __IPHONE_11_0
    //在这里搞iOS11的事情
#else
    //在这里搞低版本的事情
#endif

方式二、
#if TBC_IS_IPHONE_OS_11_LATER

#else
    
#endif


方式三、
if (@available(iOS 11.0, *))

是否为iPhone X+

方式一、(废弃)
#define IS_IPHONE_X     ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)

方式二、(废弃)
#define IS_IPHONE_X     (( fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)812) < DBL_EPSILON ) || (fabs((double)[[UIScreen mainScreen] bounds].size.width - (double)812) < DBL_EPSILON ))



方式三、
systemInfo.machine

方式四、(推荐)
static inline BOOL isIPhoneXSeries() {
    BOOL iPhoneXSeries = NO;
    if (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPhone) {
        return iPhoneXSeries;
    }
    
    if (@available(iOS 11.0, *)) {
        UIWindow *mainWindow = [[[UIApplication sharedApplication] delegate] window];
        if (mainWindow.safeAreaInsets.bottom > 0.0) {
            iPhoneXSeries = YES;
        }
    }
    
    return iPhoneXSeries;
}

二、tableView下移20或64 或 在iPhone X下上划多出一点距离

automaticallyAdjustsScrollViewInsets废弃

打印出来看看是否是安全区域引起的tableView下移问题,主要是safeAreaInsets

如下代码片段,可以看出系统对tableView向下调整了20pt的距离,因为tableView超出了安全区域范围,被statusbar覆盖

tableview.contentInset: {64, 0, 60, 0}
tableview.safeAreaInsets: {20, 0, 0, 0}
tableview.adjustedContentInset: {84, 0, 60, 0}

推荐解决方案

1、2无非就是判断写法
1、
#ifdef __IPHONE_11_0 
if ([tableView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) { 
tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; 
} 
#endif

2、
判断为>=11
if (@available(iOS 11.0, *)) { 
      self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; 
} else { 
      self.automaticallyAdjustsScrollViewInsets = NO; 
}

三、其他下移问题

在iOS 11中默认启用Self-Sizing,,Headers, footers, and cells都默认开启了Self-Sizing
所有estimated 高度默认值从iOS11之前的 0 改变为UITableViewAutomaticDimension

解决方案

1、推荐
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;
2、需同时实现
heightForHeaderInSection
viewForHeaderInSection

四、iOS 11相册写权限

iOS 11 默认开启读权限,但是写权限还要增加
Privacy - Photo Library Additions Usage Description

iOS 11之前需要添加
Privacy - Photo Library Usage Description

在 iOS 11 中必须支持 When In Use 授权模式(NSLocationWhenInUseUsageDescription)
如果不提供When In Use 授权模式,那么 Always 相关授权模式也无法正常使用。

新增
NSLocationAlwaysAndWhenInUseUsageDescription

五、新增

UISearchController *searchController API_AVAILABLE(ios(11.0))

增加API_AVAILABLE(ios(11.0))NS_AVAILABLE_IOS(9_0)

例如
@property (nonatomic, retain, nullable) UISearchController *searchController API_AVAILABLE(ios(11.0));

方法同时适用

废弃的写法

- (void) searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller NS_DEPRECATED_IOS(3_0,8_0);

SVP过期方法书写方式

+ (void)showWithMaskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use show and setDefaultMaskType: instead.")));

iPhone X+

如果用到Face ID 那么NSFaceIDUsageDescription权限加一下

开发只关心逻辑分辨率(point),目前有

320 X 480 (3GS、4、4s)
320 X 568 (5、5c、5s)
375 X 667 (6、7、8)
414 X 736 (6p、7p、8p)16:9
375 X 812 (X、XS)13:6
414 X 896 (XR)
414 X 896 (XS Max)

size

首先搞个LaunchImage

iPhone X 、XS
尺寸:1125px × 2436px
iPhone XR
尺寸:828px x 1792px
iPhone XS Max
尺寸:1242px x 2688px

状态栏由20增长到20 + 24 = 44
竖屏Tab Bar高度由49增长到49 + 34 = 83
键盘高度由216增长为216 + 75 = 291(在竖屏下包含Home Indicator)
注:竖屏Home Indicator高度为34,横屏时为21

Safe Area 与 Layout Margins

竖屏
上部留 44pt 給 Status Bar
Layout Margins 通常左右内缩 16pt。

横屏
Safe Area 左右两侧皆内缩 44pt
Layout Margins 通常左右再内缩 16pt

上一篇下一篇

猜你喜欢

热点阅读