更新时间:2022-03-16
之前的判断方式太差了,最近更新一下,感谢关注
当前iPhone有两种主要屏幕有2种类型:刘海屏、方屏(SE、Plus、7、8)配新iPhone,且SE一直在更新,那么两种屏幕样式一段时间内会共存。所以每个页面都应该考虑做好适配
先看下各个尺寸
后面13的版本中这里就不补充了,基本可以发现,高度和宽度都没什么规律,我们需要使用系统提供的函数来判断了
具体代码如下
OC
+ (BOOL)isIPhoneXSeries {
static BOOL isIphoneX = NO;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPhone) {
isIphoneX = NO;
}
else if (@available(iOS 11.0, *)) {
UIWindow *mainWindow = [[[UIApplication sharedApplication] delegate] window];
if (mainWindow.safeAreaInsets.bottom > 0.0) {
isIphoneX = YES;
}
}
});
return isIphoneX;
}
swift
func isIphoneXS() -> Bool {
var isIphoneX = false
if UIDevice.current.userInterfaceIdiom == .phone {
if #available(iOS 11.0, *) {
isIphoneX = UIApplication.shared.windows[0].safeAreaInsets.bottom > 0
} else {
// Fallback on earlier versions
isIphoneX = false
}
}
return isIphoneX;
}
// 状态栏高度
#define AdaptNaviHeight (iPhoneX ? 24 : 0)
// 导航
#define NAVIHEIGHT (iPhoneX ? 88 : 64)
// Tab bar 圆角部分高度
#define AdaptTabHeight (iPhoneX ? 34 : 0)
// Tab bar
#define TABBARHEIGHT (iPhoneX ? 83 : 49)
总结
大多数情况,如果你使用的是原生的导航,大概率不怎么关心是否有刘海。但是如果,使用了自定义导航,就必须自己来做适配了。
1、关于每个控制器的适配,我采用了继承的方式,所以导航栏的高度我在基控制器就做了控制,子控制器直接取自定义的导航,就可以做页面适配了。
2、关于自定义导航上的控件,每个按钮和标题都以导航的底部为参考,这样导航高度变了,也不会导致导航上控件的位置错误。底部工具栏也一样的道理,以工具栏顶部为参考。
3、iOS11之后,present出来的非全屏的页面,导航高度54为最佳,64和88都太高了,所以这里也要单独判断一手(直接判断弹出方式)
4、在刘海屏手机上,有个普遍的特点,四个大圆角。常规页面滚动范围,一般顶部我们都有导航或者标题,问题不大,但是底部可能没有工具栏,建议预留一定的偏移(AdaptTabHeight),这样不会被大圆角切掉内容,且页面整体上会美观一些。