美文网首页
iOS状态栏和导航栏/安全区 高度

iOS状态栏和导航栏/安全区 高度

作者: Dolway | 来源:发表于2023-09-04 15:19 被阅读0次

    随着挖孔屏的出现原来的计算方法就出bug了。现重新整理如下:

    @interface UIDevice (Addition)
    /// 顶部安全区高度
    + (CGFloat)safeDistanceTop;
    /// 底部安全区高度
    + (CGFloat)safeDistanceBottom;
    /// 顶部状态栏高度(包括安全区)
    + (CGFloat)statusBarHeight;
    /// 导航栏高度
    + (CGFloat)navigationBarHeight;
    /// 状态栏+导航栏的高度
    + (CGFloat)navigationFullHeight;
    /// 底部导航栏高度
    + (CGFloat)tabBarHeight;
    /// 底部导航栏高度(包括安全区)
    + (CGFloat)tabBarFullHeight;
    @end
    
    #import "UIDevice+Addition.h"
    
    @implementation UIDevice (Addition)
    /// 顶部安全区高度
    + (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
    
    
    import UIKit
    
    extension  UIDevice  {
    
    /// 顶部安全区高度
    static  func  ch_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  ch_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  ch_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  ch_navigationBarHeight()  ->  CGFloat  {
    return  44.0
    }
    
    /// 状态栏+导航栏的高度
    static  func  ch_navigationFullHeight()  ->  CGFloat  {
    return  UIDevice.ch_statusBarHeight()  +  UIDevice.ch_navigationBarHeight()
    }
    
    /// 底部导航栏高度
    static  func  ch_tabBarHeight()  ->  CGFloat  {
    return  49.0
    }
    
    /// 底部导航栏高度(包括安全区)
    static  func  ch_tabBarFullHeight()  ->  CGFloat  {
    return  UIDevice.ch_tabBarHeight()  +  UIDevice.ch_safedistanceBottom()
    }
    }
    

    相关文章

      网友评论

          本文标题:iOS状态栏和导航栏/安全区 高度

          本文链接:https://www.haomeiwen.com/subject/gwccvdtx.html