iPhone14Pro及iPhone14ProMax的状态栏与导航栏数据

3,223 阅读2分钟

最近在模拟器上适配iPhone14Pro和iPhone14ProMax,Xcode13和Xcode14编译出来的数据表现不一致,记录一下其中的数据,待真机发布后需要验证更新。 更新:iPhone14ProMax真机数据与模拟器表现一致

设备屏幕尺寸屏幕分辨率安全区域(上,右,下,左)状态栏(statusBarFrame)导航栏(navigationBar.frame)
iPhone14{390, 844}{1170, 2532}{47, 0, 34, 0}{{0, 0}, {390, 47}}{{0, 47}, {390, 44}}
iPhone14 Plus{428, 926}{1284, 2778}{47, 0, 34, 0}{{0, 0}, {428, 47}}{{0, 47}, {428, 44}}
iPhone14 Pro    Xcode13.4:
{390, 844}

Xcode14:
{393, 852}
Xcode13.4: {1170, 2532}

Xcode14:
{1179, 2556} 
Xcode13.4:
{59, 0, 34, 0}

Xcode14:
{59, 0, 34, 0} 
Xcode13.4:
{{0, 0}, {390, 44}}

Xcode14:
{{0, 0}, {393, 54}} 
Xcode13.4:
{{0, 59}, {390, 44}}

Xcode14:
{{0, 53.666666666666657}, {393, 44}} 
iPhone14 Pro MaxXcode13.4:
{428, 926}

Xcode14:
{430, 932} 
  Xcode13.4:
{1284, 2778}

Xcode14:
{1290, 2796} 
Xcode13.4:
{59, 0, 34, 0}

Xcode14:
{59, 0, 34, 0} 
Xcode13.4:
{{0, 0}, {428,44}}

Xcode14:
{{0, 0}, {430, 54}}  
Xcode13.4:
{{0, 59}, {428, 44}}

Xcode14:
{{0, 53.666666666666657}, {430, 44}}

其中iPhone14Pro及ProMax的导航栏top值在Xcode14编译出来是53.67,需要注意NavigationBar.bottom与状态栏+导航栏算出来的值不一致。

为了兼容Xcode13 14差异,调整一下获取状态栏高度的方法:

+ (CGFloat)statusBarHeight {
    if ( @available(iOS 13.0, *)) {
        NSSet *set = [UIApplication sharedApplication].connectedScenes;
        UIWindowScene *windowScene = [set anyObject];
        UIStatusBarManager *statusBarManager = windowScene.statusBarManager;
        CGFloat statusBarHeight = statusBarManager.statusBarFrame.size.height;
        if( @available(iOS 16.0, *)) {
            //Xcode13编译的包,在iPhone14Pro及Max取到的状态栏高度是44,实际是59,需要做调整(模拟器数据)
            BOOL needAdjust = (statusBarHeight == 44);
            if(windowScene.windows.firstObject.safeAreaInsets.top == 59 && needAdjust) {
                statusBarHeight = 59;
            }
        }
        return statusBarHeight;
    }
    CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
    CGFloat safeAreaTop = UIApplication.sharedApplication.windows.firstObject.safeAreaInsets.top;
    return MAX(statusBarHeight, safeAreaTop);
}