关于iPhone X 的适配

1.屏幕尺寸相关变化

  1. 高度增加了145pt,变成812pt.
  2. 屏幕圆角显示,注意至少留10pt边距。
  3. 状态栏高度由20pt变成44pt,留意这个距离就能避开“刘海”的尴尬,相应的导航栏以上变化64->88。
  4. 底部工具栏需要为home indicator留出34pt边距。
  5. 物理分辨率为1125px * 2436px.

2.横竖屏安全区对比

3.其他设备安全区域对比

4.应用设计

5.控件布局

更多可查看官方文档和视频Creating apps for iPhone X.

如何让APP适配?

APP启动样式适配

相信有一部分道友的APP在iPhone X上运行时并没有像想象中那样占满整个屏幕, 而是保持着原有的高度 在屏幕中心位置, 针对这个问题 目前经过实验得出可以通过以下方式使APP按照全屏模式运行:

  1. 通过LaunchScreen.storyboard方式启动
  2. 如果使用的是Assets中的LaunchImage, 在增加了iPhone X尺寸的图片配置后.

LaunchScreen.storyboard方式不用多说, 这里说一下如何在LaunchImage中增加iPhone X尺寸的图片配置.

准备一张尺寸:1125 * 2436的启动图片, 移动到LaunchImage的Finder目录中, 并在LaunchImage中的Contents.json文件中增加 (注意Json格式):

{
    "extent" : "full-screen",
    "idiom" : "iphone",
    "subtype" : "2436h",
    "filename" : "图片名.png",
    "minimum-system-version" : "11.0",
    "orientation" : "portrait",
    "scale" : "3x"
}

按照以上方式配置就完全解决了这个问题.

APP内部样式适配

iOS11为UIViewControllerUIView增加了两个新的属性safeAreaInsetssafeAreaLayoutGuide, 通过这两个属性我们可以获得安全区域的范围, 通过上图可以很清楚的看到安全区域的范围, 我们要做的是让那些不能被遮挡的内容和控件在安全区域范围内显示, 注意!这句话非常重要.

  • safeAreaInsets 适用于手动计算.
  • safeAreaLayoutGuide 适用于自动布局.

Frame布局方式适配示例

一般来说 可以通过在原有视图坐标计算时加入安全区域的范围值, 下面举个例子:

一个APP 它的NavigationBar使用的是自定义的UIView, 并非UINavigationBar, 这个自定义的UIViewframe属性为CGRectMake(0, 0, 375, 64).
这样的UIView在其他设备上是没有问题的, 标准的导航栏尺寸, 但是如果运行在iPhone X上 你会发现看上去无比的别扭, 因为异形屏幕会造成部分显示内容的遮挡问题, 这时候就要用到安全区域这个概念来解决这一问题.

先说一说通常自定义导航栏的结构, 高度是为64 由44高度的导航栏内容区域和20高度的状态栏区域(电池条那部分 status bar)组成, 44高度的导航栏内容区域用来显示导航栏上的控件, 如返回按钮 标题视图等等, 现在, 在iPhone X上, 原来的状态栏(status bar)高度不再考虑了, 取而代之的是安全区域顶部间距safeAreaInsets.top, 我们将原有的结构改为 安全区域顶部距离屏幕的距离safeAreaInsets.top + 导航栏内容区域44, 这样完成了一个自定义导航栏视图在iPhone X上的适配.

下面是适配前后的效果对比:

再来看一下适配后的自定义导航栏视图的UI结构

这只是举一个简单的例子, 因为不同的应用设计都是不同的, 但是适配的思路都是一样的, 还是那句话 我们要做的是让那些不能被遮挡的内容和控件在安全区域范围内显示, 在计算布局时 将安全区域这个新特性考虑进去, iPhone X的适配也不是难事.

说一下在代码中的安全区域的适配该如何去写:

iOS11 为UIViewControllerUIView增加了一个新的方法 - (void)viewSafeAreaInsetsDidChange;

这个方法如名字一样 在安全区域改变后会被调用, 我们可以在需要适配的UIViewControllerUIView中重写这个方法, 并且在这个方法中来根据safeAreaInsets属性更新子视图控件的布局位置.

这里有一点要注意的是当UIViewController调用- (void)viewDidLoad时它的所有子视图的safeAreaInsets属性都等于UIEdgeInsetsZero, 也就是说在- (void)viewSafeAreaInsetsDidChange;方法调用前 是无法通过当前视图控制器的子视图获取到safeAreaInsets的, 不过获取当前window对象的safeAreaInsets属性用来计算也是可以的, 但是不建议这么做, 一个视图控制器的子视图的处理当然要以它所在的控制器为准.

- (void)viewSafeAreaInsetsDidChangeUIViewController中第一次调用的时间是在- (void)viewWillAppear:(BOOL)animated调用之后, 在- (void)viewWillLayoutSubviews调用之前.

当然如果你要改变一个UIViewControllersafeAreaInsets值, 可以通过设置addtionalSafeAreaInsets属性来实现, 例如你要自定义一些特殊的样式时.

如果你改变了一个UIViewControllersafeAreaInsets属性值, - (void)viewSafeAreaInsetsDidChange也会被调用.

另外, 给道友们的分享一个获取某View安全区域范围的宏

#define VIEWSAFEAREAINSETS(view) ({UIEdgeInsets i; if(@available(iOS 11.0, *)) {i = view.safeAreaInsets;} else {i = UIEdgeInsetsZero;} i;})

使用起来比较简洁

VIEWSAFEAREAINSETS(view).left

VIEWSAFEAREAINSETS(self.view).right

AutoLayout布局方式示例

iOS11以前,我们布局时, 视图的 top 和 bottom 一般参照的是 Top Layout Guide 和 Bottom Layout Guide.

iOS11以后, 那两个参照已经 deprecated (过时)了, 而是被Safe Area所取代.

参考自官方文档

时间: 2024-10-21 10:04:31

关于iPhone X 的适配的相关文章

iOS:界面适配--iPhone不同机型适配 6/6plus

iOS:界面适配--iPhone不同机型适配 6/6plus        机型变化 坐标:表示屏幕物理尺寸大小,坐标变大了,表示机器屏幕尺寸变大了: 像素:表示屏幕图片的大小,跟坐标之间有个对应关系,比如1:1或1:2等: ppi:代表屏幕物理大小到图片大小的比例值,如果ppi不变,则坐标和像素的比例不会变: iPhone 4以前 iPhone.iPhone3/3G机型未采用retina,坐标是320 x 480,屏幕像素320 x 480 ,他们一一对应,1:1关系.即一个坐标对应1个像素.

iOS 11 与 iPhone X的适配那些事

前言 9月20日,正式推送Xcode 9和iOS 11的正式版,适配iOS 11是首要的适配的,网上教程很多,不在赘述.这里主要讲的是iPhone X的适配大神级别的可以不用看,我这里讲的主要是基础的适配工作 摘要 启动图:1125 * 2436  statusBar高度:44  tabbar高度:83 启动应用程序 对于一些老项目,在启动图上,可能没有采用XIB或者SB进行适配的,所以可能会出现如图一,这样导致整个项目运行就会不能完全贴合. ![上传login2_194373.png..] 解

iPhone X的适配

大概说下iPhone X的适配及遇到的几种问题: 1.启动页 对于一些没适配的老项目,运行后便会出现下图所示情况,解决办法,添加1125*2436尺寸的启动页,添加完后就能贴合. 2.导航栏及UITabBar部分的变化 非iPhone X : StatusBar 高20px,NavigationBar 高44px,底部TabBar高49px iPhone X: StatusBar 高44px,NavigationBar 高44px,底部TabBar高83px 解决方法,将这些数据写成宏 #def

iPhone不同机型适配 6/6plus --备用

 机型变化 坐标:表示屏幕物理尺寸大小,坐标变大了,表示机器屏幕尺寸变大了: 像素:表示屏幕图片的大小,跟坐标之间有个对应关系,比如1:1或1:2等: ppi:代表屏幕物理大小到图片大小的比例值,如果ppi不变,则坐标和像素的比例不会变: iPhone 4以前 iPhone.iPhone3/3G机型未采用retina,坐标是320 x 480,屏幕像素320 x 480 ,他们一一对应,1:1关系.即一个坐标对应1个像素. iPhone 4/4s 机器采用了retina屏幕,坐标是320 x 4

iOS:界面适配(三)--iPhone不同机型适配 6/6plus 前

转:http://blog.csdn.net/houseq/article/details/40051207 对于不同苹果设备,各个参数查看<iOS:机型参数.sdk.xcode各版本>.        机型变化 坐标:表示屏幕物理尺寸大小,坐标变大了,表示机器屏幕尺寸变大了: 像素:表示屏幕图片的大小,跟坐标之间有个对应关系,比如1:1或1:2等: ppi:代表屏幕物理大小到图片大小的比例值,如果ppi不变,则坐标和像素的比例不会变: iPhone 4以前 iPhone.iPhone3/3G

iPhone X 设计适配指南 &amp; iOS 11 新特性

设计内容不能被屏幕圆角.上方传感器区域.下方返回主页指示器所遮挡. 屏幕圆角.传感器区域和主屏幕支持器 设备的圆角.传感器区域和主页指示器 iPhone X 使用屏幕边缘手势来访问主屏幕.应用切换.通知中心和控制用心. 安全区可以防止你的内容覆盖状态栏.导航栏.工具栏和标签栏. https://mp.weixin.qq.com/s/7kM8Qiha7np6_QWfduxD-A

iPhone屏幕尺寸、分辨率及适配

目录(?)[+] 1.iPhone尺寸规格 设备 iPhone 宽 Width 高 Height 对角线 Diagonal 逻辑分辨率(point) Scale Factor 设备分辨率(pixel) PPI 3GS 2.4 inches (62.1 mm) 4.5 inches (115.5 mm) 3.5-inch 320x480 @1x 320x480 163 4(s) 2.31 inches (58.6 mm) 4.5 inches (115.2 mm) 3.5-inch 320x480

【转】iPhone屏幕尺寸、分辨率及适配

原文网址:http://blog.csdn.net/phunxm/article/details/42174937 1.iPhone尺寸规格 设备 iPhone 宽 Width 高 Height 对角线 Diagonal 逻辑分辨率(point) Scale Factor 设备分辨率(pixel) PPI 3GS 2.4 inches (62.1 mm) 4.5 inches (115.5 mm) 3.5-inch 320x480 @1x 320x480 163 4(s) 2.31 inches

IOS之ipad和iphone之间的xib的适配所有的屏幕

今天在项目中运到了这个的一个问题,就是在原来的xib的是适配所有的iphone屏幕,然而现在既要适配iphone 也要适配Ipad,搞的很头大,现在就为了实现这个效果,老大给我了两种方法,就是在xib的基础上修改的,之直接上代码了,不多说了. 第一种方式:修改xib的文件(source code) 1.在适配所有的iphone的屏幕的xib中会出现这个东西: <variation key="default"> <mask key="subviews"