最近发现一个项目的一个适配问题,当时是简单的适配了一下iPhone X,导致的结果就是当前的app在iPhone XR的情况下界面异常。
最初的判断逻辑:
#define iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
仅仅采取mode的size大小来判断。
结果iPhone XR 是:
很明显上述最初的逻辑只考虑了iPhone X ,未考虑到其他机型。
如果后续再出新的设备,是否判断方法一直有问题。所以今天研究出新方法已被一劳永逸:
方法一:采取新的系统方法 safeAreaInsets;
var iPhoneX : Bool {if#available(iOS 11, *) {iflet w =UIApplication.shared.delegate?.window, let window = w, window.safeAreaInsets.left >0|| window.safeAreaInsets.bottom >0{returntrue} }returnfalse}
// 方法二 刘海屏的设计模式
let iPhoneX =UIApplication.shared.statusBarFrame.height >=44
总结:iPhone x 系列产品,其实应该来自于根因,新的界面必带来的新的方法。上述是否话可以新增一个是否满足faceID,是否也可以作为新的判断。上述方法,供大家参考。