如何为基于autoresizing、部署目标iOS8的iOS应用适配iPhone X?
适配iPhone X(及后续全面屏)的关键步骤
嘿,这个问题我太有发言权了!之前接手过好几个基于iOS 8、用autoresizing布局的老项目,要适配全面屏其实不用完全推翻重来,按下面这几步走就行:
1. 先搞定启动图/启动屏幕
iPhone X及之后的全面屏设备需要对应的启动资源,不然App启动后会被拉伸或者显示黑边:
- 如果你的项目还在用Launch Images(旧的启动图资源),得添加对应全面屏的尺寸图:iPhone X/XS是1125×2436,XR是828×1792,XS Max是1242×2688。记得在Assets里的LaunchImage文件夹里添加这些尺寸的图,并勾选对应的设备。
- 更省心的方式是换成Launch Screen.storyboard(启动屏幕),它会自动适配所有屏幕尺寸,而且iOS 8是支持的。只要把原来的启动图内容放到这个storyboard里,设置好自适应规则(用autoresizing或者简单约束都可以),然后在项目设置里把Launch Screen File改成这个storyboard就行。
2. 适配安全区域(Safe Area)
这是解决刘海和底部小黑条遮挡问题的核心:
- 如果用代码布局(autoresizing):
原来的布局逻辑可能基于视图的bounds或frame,现在要加入safeAreaInsets来避开系统预留区域。比如调整底部工具栏的位置:
别忘了做版本判断,iOS 8-10的设备不需要考虑安全区域,沿用原来的逻辑即可。// 计算底部安全区域间距 CGFloat bottomInset = 0; if (@available(iOS 11.0, *)) { bottomInset = self.view.safeAreaInsets.bottom; } // 重新设置工具栏frame CGRect toolbarFrame = self.toolbar.frame; toolbarFrame.origin.y = self.view.bounds.size.height - toolbarFrame.size.height - bottomInset; self.toolbar.frame = toolbarFrame; - 如果用XIB/Storyboard:
打开xib文件,把原来约束到父视图边缘的设置,改成约束到Safe Area的边缘(比如底部约束从Superview.Bottom换成Safe Area.Bottom)。要是iOS 8的XIB里没显示Safe Area选项,可以临时把XIB的Deployment Target改成iOS 11调整完,再改回iOS 8就行。
3. 调整Autoresizing Mask的设置
原来的autoresizing可能没适配全面屏的宽高比,容易出现视图拉伸变形:
- 检查每个关键视图的
autoresizingMask:中间的内容视图可以设置UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight来自适应屏幕;顶部导航栏、底部工具栏这类固定位置的视图,只保留UIViewAutoresizingFlexibleWidth,垂直方向不要开拉伸,再结合安全区域调整位置。 - 对于固定宽高比的视图(比如图标、图片),别同时开水平和垂直方向的拉伸,或者在代码里手动调整frame来维持比例。
4. 处理状态栏和导航栏的高度变化
iPhone X的状态栏高度是44pt(旧设备是20pt),导航栏加状态栏总高度变成88pt(旧设备是64pt):
- 如果项目里有自定义导航栏或依赖状态栏高度的布局,要动态获取高度:
同样通过版本判断区分全面屏和旧设备的高度差异。CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
5. 测试边缘场景
最后一定要在iPhone X模拟器或真机上测这些场景:
- 页面滚动时,内容会不会被刘海或底部小黑条遮挡?
- 弹出键盘时,底部输入框会不会被键盘+小黑条双重遮挡?
- 横屏模式下的布局是否正常?
内容的提问来源于stack exchange,提问作者JAK
相关产品推荐
相关产品推荐

