iOS 狀態欄、導航欄、TabBar高度適配

Objective-C 版本

@interface UIDevice (VGAddition)

/// 頂部安全區高度
+ (CGFloat)safeDistanceTop;

/// 底部安全區高度
+ (CGFloat)safeDistanceBottom;

/// 頂部狀態欄高度(包括安全區)
+ (CGFloat)statusBarHeight;

/// 導航欄高度
+ (CGFloat)navigationBarHeight;

/// 狀態欄+導航欄的高度
+ (CGFloat)navigationFullHeight;

/// 底部導航欄高度
+ (CGFloat)tabBarHeight;

/// 底部導航欄高度(包括安全區)
+ (CGFloat)tabBarFullHeight;

@end
#import "UIDevice+VGAddition.h"

@implementation UIDevice (VGAddition)

/// 頂部安全區高度
+ (CGFloat)safeDistanceTop {
    if (@available(iOS 13.0, *)) {
        NSSet *set = [UIApplication sharedApplication].connectedScenes;
        UIWindowScene *windowScene = [set anyObject];
        UIWindow *window = windowScene.windows.firstObject;
        return window.safeAreaInsets.top;
    } else if (@available(iOS 11.0, *)) {
        UIWindow *window = [UIApplication sharedApplication].windows.firstObject;
        return window.safeAreaInsets.top;
    }
    return 0;
}

/// 底部安全區高度
+ (CGFloat)safeDistanceBottom {
    if (@available(iOS 13.0, *)) {
        NSSet *set = [UIApplication sharedApplication].connectedScenes;
        UIWindowScene *windowScene = [set anyObject];
        UIWindow *window = windowScene.windows.firstObject;
        return window.safeAreaInsets.bottom;
    } else if (@available(iOS 11.0, *)) {
        UIWindow *window = [UIApplication sharedApplication].windows.firstObject;
        return window.safeAreaInsets.bottom;
    }
    return 0;
}


/// 頂部狀態欄高度(包括安全區)
+ (CGFloat)statusBarHeight {
    if (@available(iOS 13.0, *)) {
        NSSet *set = [UIApplication sharedApplication].connectedScenes;
        UIWindowScene *windowScene = [set anyObject];
        UIStatusBarManager *statusBarManager = windowScene.statusBarManager;
        return statusBarManager.statusBarFrame.size.height;
    } else {
        return [UIApplication sharedApplication].statusBarFrame.size.height;
    }
}

/// 導航欄高度
+ (CGFloat)navigationBarHeight {
    return 44.0f;
}

/// 狀態欄+導航欄的高度
+ (CGFloat)navigationFullHeight {
    return [UIDevice safeDistanceTop] + [UIDevice navigationBarHeight];
}

/// 底部導航欄高度
+ (CGFloat)tabBarHeight {
    return 49.0f;
}

/// 底部導航欄高度(包括安全區)
+ (CGFloat)tabBarFullHeight {
    return [UIDevice statusBarHeight] + [UIDevice safeDistanceBottom];
}

@end

Swift 版本

import UIKit

extension  UIDevice  {

/// 頂部安全區高度
static  func  vg_safedistancetop()  ->  CGFloat  {
     if  #available(iOS 13.0,  *)  {
        let scene =  UIApplication.shared.connectedScenes.first
        guard  let windowScene = scene as?  UIWindowScene  else  {  return  0  }
        guard  let window = windowScene.windows.first else  {  return  0  }
        return window.safeAreaInsets.top
    }  else  if  #available(iOS 11.0,  *)  {
        guard  let window =  UIApplication.shared.windows.first else  {  return  0  }
          return window.safeAreaInsets.top
        }
              return  0;
          }

/// 底部安全區高度
static  func  vg_safedistanceBottom()  ->  CGFloat  {
    if  #available(iOS 13.0,  *)  {
        let scene =  UIApplication.shared.connectedScenes.first
        guard  let windowScene = scene as?  UIWindowScene  else  {  return  0  }
        guard  let window = windowScene.windows.first else  {  return  0  }
        return window.safeAreaInsets.bottom
  }  else  if  #available(iOS 11.0,  *)  {
          guard  let window =  UIApplication.shared.windows.first else  {  return  0  }
          return window.safeAreaInsets.bottom
  }
return  0;
}

/// 頂部狀態欄高度(包括安全區)
static  func  vg_statusBarHeight()  ->  CGFloat  {
var statusBarHeight:  CGFloat  =  0
if  #available(iOS 13.0,  *)  {
let scene =  UIApplication.shared.connectedScenes.first
guard  let windowScene = scene as?  UIWindowScene  else  {  return  0  }
guard  let statusBarManager = windowScene.statusBarManager else  {  return  0  }
statusBarHeight = statusBarManager.statusBarFrame.height
}  else  {
statusBarHeight =  UIApplication.shared.statusBarFrame.height
}
return statusBarHeight
}

/// 導航欄高度
static  func  vg_navigationBarHeight()  ->  CGFloat  {
return  44.0
}

/// 狀態欄+導航欄的高度
static  func  vg_navigationFullHeight()  ->  CGFloat  {
return  UIDevice.vg_statusBarHeight()  +  UIDevice.vg_navigationBarHeight()
}

/// 底部導航欄高度
static  func  vg_tabBarHeight()  ->  CGFloat  {
return  49.0
}

/// 底部導航欄高度(包括安全區)
static  func  vg_tabBarFullHeight()  ->  CGFloat  {
return  UIDevice.vg_tabBarHeight()  +  UIDevice.vg_safedistanceBottom()
}
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容