支持Xcode10和适配iPhone XS Max、iPhone XR的方法

本文介绍了支持Xcode10和适配iPhone XS Max、iPhone XR的方法,分享给大家,具体如下,

目前我们项目已做了Xcode10(swift4.0)和新机型的适配,总结一下遇到的问题和修改的内容,希望帮助到其他人,如果您有不同的看法或遗漏,欢迎指出!

1.第三方库编译报错

如果项目里用到了Mixpanel-swift和SwiftLint,这两个在Xcode10上会报错,目前作者已提交新版本分别是2.4.5和0.27.0,更新后即可解决报错。

2.library not found for - lstdc++.6.0.9

pod工程编译通过后会进行主工程的编译,如果依赖了libstdc++.tbd和libstdc++.6.0.9.tbd,就会报这个error,原因是苹果在XCode10和iOS12中移除了libstdc++这个库,由libc++这个库取而代之,苹果的解释是libstdc++已经标记为废弃有5年了,建议大家使用经过了llvm优化过并且全面支持C++11的libc++库。

临时的解决方法就是把libstdc++.6.0.9.tbd这个文件导入到Xcode10中,分别放到以下目录 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/   和 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/  这时编译可以通过。

但这只是临时的解决方案,如果你自己的业务模块使用了libstdc++,那么就把模块代码重新调整为依赖libc++,然后重新检查是否存在问题,重新编译。如果你引用的第三方厂商提供的sdk中依赖了libstdc++,那么抓紧联系厂商,要求版本升级。

3.Enum case '...' not found in type '...'

解决好上面两个报错,编译程序时还会显示这个error,具体场景如下:

PosVisitQuestionType: String {
  case text
  case textArea = "text_area"
  case dropDownList = "drop_down_list"
  case radioButton = "radio_button"
}
let type: PosVisitQuestionType!
...
switch type {
case .text, .textArea:
  errorText = NSLocalizedString("Please enter the following options", comment: "")
case .dropDownList, .radioButton:
  errorText = NSLocalizedString("Click the right button to get current location", comment: "")
default:
  break
}

Xcode10建议每个case 情况下加“?”

原因可能是 type是可选的,所以每个case情况要与type类型保持一致,所以提示加 “?”,可能是Xcode10编译器更新的原因。

修改的方法是如果确定type会被赋值,那在定义的时候就把“!”去掉,如果不确定type是否有值就按照Xcode提示修改。

4.适配iPhone XS Max、iPhone XR

我们项目在获取机型等信息用的是DeviceKit这个第三方库,所以也需要更新一下才能获取到新机型的信息,最新版是1.8.1。在最新版有这样一个变量

/// All Face ID Capable Devices
  static public var allFaceIDCapableDevices: [Device] {
   return [.iPhoneX, .iPhoneXs, .iPhoneXsMax, .iPhoneXr]
  }

由于iPhone X、iPhone XS、iPhone XS Max、iPhone XR这些机型的navigationBar高度以及tabBar高度都一致,所以可以用allFaceIDCapableDevices是否包含当前设备,来判断当前设备是否有“齐刘海”。

示例:

static let faceIDDeviceArray = Device.allFaceIDCapableDevices

static let navigationHeight: CGFloat = {
    if faceIDDeviceArray.contains(currentDevice) {
      return faceIDDeviceNavHeight
    } else {
      return ordinaryDeviceNavHeight
    }
  }()

同时DeviceKit中也提供这样一个方法,运行模拟器的时候调用,也会返回真实的设备名称

/// Get the real device from a device. If the device is a an iPhone8Plus simulator this function returns .iPhone8Plus (the real device).
  /// If the parameter is a real device, this function returns just that passed parameter.
  ///
  /// - parameter device: A device.
  ///
  /// - returns: the underlying device If the `device` is a `simulator`,
  /// otherwise return the `device`.
  public static func realDevice(from device: DeviceKit.Device) -> DeviceKit.Device

示例:

static let currentDevice = Device.realDevice(from: Device())
if currentDevice == .iPhoneX {}
// 取代以下写法
if Device() == .iPhoneX || Device() == .simulator(.iPhoneX) {}

最后别忘了再切两张启动图,因为iPhone XS和尺寸和iPhone X是一样的,所以iPhone XS可以忽略

iPhone XR:828px x 1792px

iPhone XS Max: 1242px x 2688px

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • iPhoneX 各种适配记录笔记(超全面)

    前言 与以往的iPhone不同,这次iPhone X用上了时下流行的全面屏设计,屏幕的分辨率和比例都是苹果首次采用,而且还有个"别致的刘海",这就需要现有的APP为iPhone X重新作适配了. 所以iPhone X 的到来,惊艳的是果粉,苦逼的是程序猿.今天升级到Xcode9.0,运行项目,所谓的全屏 iPhone X,but 页面好像也没有全屏,于是根据之前的适配经验,总算初步解决了这个问题,记录如下,以备后需. App 页面适配适配前 适配前 问题:App 未全屏显示 解决办法

  • 关于适配iOS11和iPhoneX的一些事

    前言 众所周知iOS11正式版终于来了,最近也把app适配了一下,其实也不是很麻烦,来看看我做的一些操作,话不多说了,来一起看看吧. 1.UITableView.UICollectionView的变化 tableView在iOS11默认使用Self-Sizing,tableView的estimatedRowHeight.estimatedSectionHeaderHeight. estimatedSectionFooterHeight三个高度估算属性由默认的0变成了UITableViewAuto

  • iPhoneX 序列适配方案(小结)

    和往常一样,苹果发布新产品,我们作为开发者都需要对系统和UI布局进行适配,今年也是一样.从去年发布的 iphoneX开始,iPhone 手机加入了刘海设计,而且针对于iphone的刘海,需要特殊的适配.今年新出的3款iphone都带有刘海,自然也不例外. 在iphonex以前iphone的顶部导航栏高度都是统一的64,底部导航栏是统一的49:从iphonex的刘海屏开始,出了一个SafeArea的概念,带刘海设计的iphone,顶部导航的高度由原来的64,变成了88,因为状态栏的高度由原来的20

  • iOS11和iPhoneX适配的一些坑

    本文转载于:http://www.cocoachina.com/ios/20170921/20623.html 导航栏 导航栏高度的变化 iOS11之前导航栏默认高度为64pt(这里高度指statusBar + NavigationBar),iOS11之后如果设置了prefersLargeTitles = YES则为96pt,默认情况下还是64pt,但在iPhoneX上由于刘海的出现statusBar由以前的20pt变成了44pt,所以iPhoneX上高度变为88pt,如果项目里隐藏了导航栏加了

  • iOS11&iPhoneX适配&Xcode9打包注意事项

    1,适配UITableView if#available(iOS11.0, *) { self.contentInsetAdjustmentBehavior= .never self.estimatedRowHeight=0 self.estimatedSectionHeaderHeight=0 self.estimatedSectionFooterHeight=0 }else{ } 2,适配UIScrollView if#available(iOS11.0, *) { scrollView?.

  • iOS 11 safeArea详解及iphoneX 适配

    最近看了许多iPhone X适配的文章,发现很少有介绍safeArea的,就来随便写写 现在对于iPhone X的适配,有一种常见的做法是给导航栏或tabbar增加一个固定的距离,比如顶部增加44pt,底部增加34pt.这种写死距离的做法乍看上去挺简单,其实并不好,理由如下 不适合多机型的适配,如果以后出了一种带刘海的iPad,需要预留出来的距离就未必是现在写死的距离 不适合需要支持横竖屏的app,横屏顶部不需要增加距离,反而是左右各有44pt,底部的距离也和竖屏不同 不够动态.还是举个例子,假

  • 微信小程序适配iphoneX的实现方法

    一. 安全区域(safe area) 与iPhone6/6s/7/8相比,iPhone X 无论是在屏幕尺寸.分辨率.甚至是形状上都发生了较大的改变,下面以iPhone 8作为参照物,先看看iPhone X尺寸上的变化: 苹果对于 iPhone X 的设计布局意见如下: 核心内容应该处于 Safe area 确保不会被设备圆角(corners),传感器外壳(sensor housing,齐刘海) 以及底部的 Home Indicator 遮挡.也就是说 我们设计显示的内容应该尽可能的在安全区域内

  • iPhoneX无导航栏页面适配问题解决方案

    原全屏适配在iPhoneX会由于安全区域的变化导致显示不全. 解决方案如下: 在self.view上添加一个view,剩下的视图基于该view布局,view的约束随self.view.safeAreaInsets的改变需要重置: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [UIColor blac

  • 适配iPhoneXS max和iPhoneX R的方法示例

    9.18更新:经测试发现iOS12修改了非刘海屏safeArea的值! 拿iPhone6竖屏情况下为例iOS11中返回的safeAreaInsets为(0,0,0,0):iOS12中返回的safeAreaInsets为(20,0,0,0):是的这个top-20是状态栏.这里大家要注意下,不应该盲目使用safeAreaInsets,而是使用我下面类似的判断刘海屏的方法来区分刘海屏后再决定是否使用safeAreaInsets: 今年的三款新手机已经发布,加上Xcode10已经发布GM Seed版本,

  • Xcode 9下适配iPhoneX导致iOS 10不兼容问题的解决方法

    前言 前久发现测试组提交来一个 bug,说有的布局在 iOS 11 上正常,在 iOS 10 下不正常.分别在 iOS 11 模拟器和 iOS 10.3 模拟器上跑了一下 app,发现果然如此,如下图所示: iOS 11 下点击"省市广播站",下级菜单中的按钮正常显示: iOS 10 下点击"省市广播站",下级菜单显示为空白: 解决方法 检查代码,发现下级菜单中的按钮是以手动布局方式动态添加到一个 scroll view 中的.添加时指定了按钮的框架,框架计算完全正

随机推荐