iPhoneX适配指南(iOS8+兼容版) #嘿,我刚好做过iOS8+应用适配iPhoneX的活儿,给你整理几个关键步骤,照着来基本就能完美适配啦:
1. 先搞定启动图,避免缩放黑边 #iPhoneX的屏幕分辨率是1125x2436(@3x),如果没有对应的启动图,系统会自动把应用按旧机型尺寸缩放,导致上下出现黑边。你需要在Assets.xcassets的LaunchImage里添加这个尺寸的启动图,确保应用以原生分辨率加载。
2. 处理安全区域,避开刘海和Home Indicator #iPhoneX的顶部刘海(24pt)和底部Home Indicator(34pt)是布局的“禁区”,但iOS8没有官方的Safe Area API,所以得做版本兼容:
如果你用Auto Layout: #iOS11及以上:直接使用safeAreaLayoutGuide的约束(比如topAnchor对应safeAreaLayoutGuide.topAnchor);iOS8-10: fallback到topLayoutGuide和bottomLayoutGuide(对应导航栏/状态栏底部、工具栏顶部)。可以用代码封装兼容逻辑:
Objective-C 宏定义:#define SafeAreaTop ([[UIApplication sharedApplication] respondsToSelector:@selector(keyWindow)] ? [UIApplication sharedApplication].keyWindow.safeAreaInsets.top : 0)
#define SafeAreaBottom ([[UIApplication sharedApplication] respondsToSelector:@selector(keyWindow)] ? [UIApplication sharedApplication].keyWindow.safeAreaInsets.bottom : 0)
Swift 扩展:extension UIViewController {
var safeTopInset: CGFloat {
if #available(iOS 11.0, *) {
return view.safeAreaInsets.top
} else {
return topLayoutGuide.length
}
}
var safeBottomInset: CGFloat {
if #available(iOS 11.0, *) {
return view.safeAreaInsets.bottom
} else {
return bottomLayoutGuide.length
}
}
}
如果你用Frame布局: #计算控件位置时,要手动避开危险区域:
顶部控件的Y坐标 = SafeAreaTop(iOS11+)或状态栏高度(iOS8-10);底部控件的底部Y坐标 = 屏幕高度 - SafeAreaBottom(iOS11+)或直接贴屏幕底部(iOS8-10)。3. 调整导航栏与底部控件 #导航栏:iPhoneX的状态栏高度是44pt(普通机型是20pt),自定义导航栏时要调整总高度:if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone && ![UIApplication sharedApplication].statusBarHidden) {
CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
self.navigationController.navigationBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 44 + statusBarHeight);
}
底部操作栏:像你截图里的底部按钮栏,要确保它在Home Indicator上方,也就是距离底部至少34pt(iOS11+),旧版本可以正常贴底部。4. 全屏页面的特殊处理 #如果有全屏展示的页面(比如图片、视频):
确保核心内容不被刘海遮挡,可通过调整内边距避开顶部24pt区域;可以设置prefersHomeIndicatorAutoHidden = true让Home Indicator自动隐藏,但用户上滑时仍会弹出,这是系统默认行为。5. 多场景测试 #别忘了测试横屏/竖屏切换、模态弹窗、滚动视图等场景,确保所有布局在iPhoneX上都能正常显示,没有被遮挡或留白的问题。
附你提供的参考图:
内容的提问来源于stack exchange,提问作者Krutika Sonawala