判断 iPhone X 机型 (Swift)
如何判断当前的设备是 iPhone X 呢?有好几种办法,可以考虑取得「iPhone 10,1」这样的 Module Name 来判断,也可以用屏幕分辨率的形式来判断。我觉得要用屏幕分辨率的方式来做,因为这是目前为止最简单也最不容易出错的。因为 iPhone X 只有一种分辨率,那就是 812pt x 375pt (@3x),且没有任何其他设备用了一样的分辨率,特别是高度。
于是写了一个基于 UIDevice 的扩展(或者其他任意方法也行):
extension UIDevice { public func isX() -> Bool { if UIScreen.main.bounds.height == 812 { return true } return false } }
在代码中,就可以用 UIDevice.current.isX() 来判断是不是跑在 iPhone X 机型上,然后做一些或不做一些特殊的 Hack 了。
当然如果你习惯用三方库,也可以尝试“DeviceKit”
let device = Device() print(device) // prints, for example, "iPhone X" if device == .iPhoneX { // Do something } else { // Do something else }
代码适配部分
当我们能够判断出设备型号就可以配合系统版本进行适配了
1.适配 UITableView 组件
if (@available(iOS 11.0, *)) { self.contentInsetAdjustmentBehavior = .never self.estimatedRowHeight = 0 self.estimatedSectionHeaderHeight = 0 self.estimatedSectionFooterHeight = 0 } else { // Fallback on earlier versions }
2.适配 UIScrollView 组件
if (@available(iOS 11.0, *)) { scrollView?.contentInsetAdjustmentBehavior = .never } else { // Fallback on earlier versions }
3.UITableView中的sectionHeader或者Footer显示不正常
还有的发现某些界面tableView的sectionHeader、sectionFooter高度与设置不符的问题,在iOS11中如果不实现-tableView: viewForHeaderInSection:和-tableView: viewForFooterInSection:,则-tableView: heightForHeaderInSection:和- tableView: heightForFooterInSection:不会被调用,导致它们都变成了默认高度,这是因为tableView在iOS11默认使用Self-Sizing,tableView的estimatedRowHeight、estimatedSectionHeaderHeight、estimatedSectionFooterHeight三个高度估算属性由默认的0变成了UITableViewAutomaticDimension,解决办法简单粗暴,就是实现对应方法或把这三个属性设为0。
if #available(iOS 11.0, *) { tableView.estimatedRowHeight = 0; tableView.estimatedSectionHeaderHeight = 0; tableView.estimatedSectionFooterHeight = 0; } else { automaticallyAdjustsScrollViewInsets = false; };
4.适配网页加载不全下面有白边
if #available(iOS 11.0, *) { webView.scrollView.contentInsetAdjustmentBehavior = .never } else { };
5.适配iPhoneX不能铺满屏的问题
<1>给Brand Assets添加一张1125*2436大小的图片
打开Assets.xcassets文件夹,找到Brand Assets
右键Show in Finder
添加一张1125*2436大小的图片
<2>修改Contents.json文件,添加如下内容
{ "extent" : "full-screen", "idiom" : "iphone", "subtype" : "2436h", "filename" : "1125_2436.png”, "minimum-system-version" : "11.0", "orientation" : "portrait", "scale" : "3x" }
<3>使用 LaunchScreen.storyboard 设置启动图
使用 LaunchScreen.storyboard 文件将简单视图约束定位,实现各种尺寸的自适应。
6.适配iPhoneX
//适配iPhoneX let LL_iPhoneX = (kScreenW == Double(375.0) && kScreenH == Double(812.0) ?true:false) let kNavibarH = LL_iPhoneX ? Double(88.0) : Double(64.0) let kTabbarH = LL_iPhoneX ? Double(49.0+34.0) : Double(49.0) let kStatusbarH = LL_iPhoneX ? Double(44.0) : Double(20.0)
7.Xcode9 打包注意事项
Xcode9 打包版本只能是8.2及以下版本,或者9.0及更高版本
Xcode9 不支持8.3和8.4版本
Xcode9 新打包要在构建版本的时候加入1024*1024 AppSore icon
Xcode9 沿用了之前的分包设计,可以配置打出多种设备的包文件,用户安装时根据设备不同分别安装不同的API包,减小安装包大小。
8.iOS 11 相册权限变更
iOS11以前:
NSPhotoLibraryUsageDescription:访问相册和存储照片到相册(读写),会出现用户授权。
iOS11之后:
NSPhotoLibraryUsageDescription:无需添加。默认开启访问相册权限(读),无需用户授权。
NSPhotoLibraryAddUsageDescription: 添加内容到相册。(写),会出现用户授权。