美文网首页Swift 语言:
各种常用的命令宏:状态栏高度等等(Objective-C、Swi

各种常用的命令宏:状态栏高度等等(Objective-C、Swi

作者: 阳光下的叶子呵 | 来源:发表于2021-03-26 16:34 被阅读0次

    创建PCH文件(Objective-C和Swift)

    • 注意:Swift中的”#pragma mark”
      在今天初用Swift编码时,我发现平时很习惯的 #pragma mark 不见了,去查了资料才发现Swift中这个也改了,现在Swift中的用法如下
    // MARK: - XXXXXX    相当于#pragma mark - XXXXXX
    
    // TODO: XXXXXX      相当于#pragma mark XXXXXX
    
    // FIXME: XXXXXX     相当于额....随意了
    

    如果MARK后不加 - ,那么就不会有分割线效果

    • 一、Swift宏命令:

    import UIKit
    
    // 自动布局,相当于 Objective-C 中的 Masonry,(Swift 中使用 SnapKit)
    import SnapKit
    
    
    // MARK: - 其他 -
    /**
     *  1、颜色
     */
    // rgb颜色转换(16进制->10进制)
    func RGBA(R:CGFloat,G:CGFloat,B:CGFloat,A:CGFloat) ->UIColor {
        return UIColor(red: R/255.0, green: G/255.0, blue: B/255.0, alpha: A)
    //    return UIColor.init(red: R/255.0, green: G/255.0, blue: B/255.0, alpha: A)
    }
    
    //弱引用
    //let weakSelf  __weak __typeof(&*self)weakSelf = self;
    
    // MARK: - 尺寸信息: -
    /* 状态栏高度  20 或 44 */
    // 然而从iOS 14开始,全面屏iPhone的状态栏高度不一定是 44 或 20 了,比如下面就是这些设备在iOS 14.1上的状态栏高度。(还可能时47、48)
    /// ①、顶部状态栏高度(包括安全区)
    func k_Height_statusBar() -> 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;
    }
    /// ②、顶部安全区高度 k_Height_safeAreaInsetsTop
    func k_Height_safeAreaInsetsTop() -> CGFloat {
        if #available(iOS 13.0, *) {
            let scene = UIApplication.shared.connectedScenes.first;
            guard let windowScene = scene as? UIWindowScene else {return 0}; // guard:如果 expression 值计算为false,则执行代码块内的 guard 语句。(必须包含一个控制语句: return、 break、 continue 或 throw。)。as?:类型转换,(还有这两种:as、as!)
            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;
    }
    
    /// ③、底部安全区高度
    func k_Height_safeAreaInsetsBottom() -> 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;
    }
    
    /** 屏幕宽度 */
    let kScreenWidth = UIScreen.main.bounds.size.width
    /** 屏幕高度 */
    let kScreenHeight = UIScreen.main.bounds.size.height
    /* 导航栏高度 固定高度 = 44.0f */
    //let k_Height_NavContentBar :CGFloat  = UINavigationBar.appearance().frame.size.height
    let k_Height_NavContentBar :CGFloat = 44.0
    /** 状态栏高度 */
    let k_Height_StatusBar :CGFloat = k_Height_statusBar()
    /** 状态栏+导航栏的高度 */
    let k_Height_NavigationtBarAndStatuBar: CGFloat = k_Height_NavContentBar + k_Height_StatusBar
    /** 底部tabBar栏高度(不包含安全区,即:在 iphoneX 之前的手机) */
    let k_TabBar_Height :CGFloat = 49.0
    /** 底部导航栏高度(包括安全区),一般使用这个值 */
    let k_Height_TabBar :CGFloat = k_Height_safeAreaInsetsBottom() + k_TabBar_Height
    
    
    
    // MARK: - 检查系统版本 -
    /* 检查系统版本 */
    /// 版本号相同:
    func systemVersionEqual(version:String) -> Bool {
        return UIDevice.current.systemVersion == version
    }
    
    /// 系统版本高于等于该version  测试发现只能传入带一位小数点的版本号  不然会报错    具体原因待探究
    func systemVersionGreaterThan(version:String) -> Bool {
        return UIDevice.current.systemVersion.compare(version, options: .numeric, range: version.startIndex..<version.endIndex, locale: Locale(identifier:version)) != ComparisonResult.orderedAscending
    }
    
    //判断是否是 x、及x以上 系列
    func isIphoneX() -> Bool {
        return k_Height_safeAreaInsetsBottom() > 0.0; // 底部安全区 > 0 时,
        
    }
    
    

    例如,在iphone11 运行,输入结果如下:

    print(" 屏幕 宽度 = \(kScreenWidth) \n",
                  "屏幕 高度 = \(kScreenHeight) \n",
                  "导航栏 高度 = \(k_Height_NavContentBar) \n",
                  "状态栏 高度 = \(k_Height_StatusBar) \n",
                  "状态栏+导航栏的 高度 = \(k_Height_NavigationtBarAndStatuBar) \n",
                  "底部tabBar栏 高度 = \(k_TabBar_Height) \n",
                  "底部导航栏高度(包括安全区) = \(k_Height_TabBar) \n",
                  "该设备是否是 iphoneX以上系列的手机📱 = \(isIphoneX())"
            )
    /**
     屏幕 宽度 = 414.0 
     屏幕 高度 = 896.0 
     导航栏 高度 = 44.0 
     状态栏 高度 = 48.0 
     状态栏+导航栏的 高度 = 92.0 
     底部tabBar栏 高度 = 49.0 
     底部导航栏高度(包括安全区) = 83.0 
     该设备是否是 iphoneX以上系列的手机📱 = true
    
    */
    
    
    • 二、Objective-C宏命令:

    1、问题:

    有些情况下,我们需要获取屏幕的状态栏高度,很多人使用类似下面的宏:

    #define StatusBar_HEIGHT     (DEVICE_IS_FULL_DISPLAY ? 44.: 20.)
    

    然而从iOS 14开始,全面屏iPhone的状态栏高度不一定是44了,比如下面就是这些设备在iOS 14.1上的状态栏高度。

    设备 状态栏高度
    iPhone XR/11 48
    iPhone X/11 Pro/ 11 Pro Max/12 mini 44
    iPhone 12/12 Pro/Pro Max 47

    解决办法:
    根据不同系统,通过相应方法获取状态栏高度。使用下面的:k_Height_StatusBar

    + (CGFloat)statusBarHeight {
        CGFloat statusBarHeight = 0;
        if (@available(iOS 13.0, *)) {
            statusBarHeight = [UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager.statusBarFrame.size.height;
        } else {
            statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
        }
        return statusBarHeight;
    }
    
    在使用命令宏时,这样写:
    //判断是否是 x系列
    #define iPhoneX  \
    ({BOOL isPhoneX = NO;\
    if (@available(iOS 11.0, *)) {\
    isPhoneX = [[UIApplication sharedApplication] delegate].window.safeAreaInsets.bottom > 0.0;\
    }\
    (isPhoneX);})
    
    //NavBar高度
    #define k_Height_NavContentBar 44.0f
    //状态栏 statusBar 高度
    //#define k_Height_StatusBar [[UIApplication sharedApplication] statusBarFrame].size.height
    // 然而从iOS 14开始,全面屏iPhone的状态栏高度不一定是 44 或 20 了,比如下面就是这些设备在iOS 14.1上的状态栏高度。(还可能时47、48)
    #define k_Height_StatusBar \
    ({\
    CGFloat statusBarHeight = 0;\
    if (@available(iOS 13.0, *)) {\
        statusBarHeight =[UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager.statusBarFrame.size.height;\
    } else {\
        statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;\
    }\
    (statusBarHeight);\
    })
    //导航栏的高度
    #define k_Height_NavBar k_Height_StatusBar + 44
    //TabBar高度
    #define k_Height_TabBar (iPhoneX ? 83.0 : 49.0)
    //底部安全区的高度
    #define k_XBOTTOM_HEIGHT        (iPhoneX ? 34.0 : 0.0)
    
    
    

    在iOS 13.0之后, 获取keyWindow,比如使用下面代码使用时:[[self getKeyWindow] addSubView:subView];

    /**
     *  获取keyWindow
     */
    + (UIWindow *)getKeyWindow {
        if (@available(iOS 13.0, *)) {
            for (UIWindowScene *windowScene in [UIApplication sharedApplication].connectedScenes) {
                if (windowScene.activationState == UISceneActivationStateForegroundActive) {
                    for (UIWindow *window in windowScene.windows) {
                        if (window.isKeyWindow) {
                            return window;
                        }
                    }
                }
            }
        } else {
            return [UIApplication sharedApplication].keyWindow;
        }
        return nil;
    }
    

    3、下面是其他一下宏命令:

    #define WEAK_SELF __weak typeof(self)weakSelf = self;
    
    //#MARK: 设备信息判断
    //ios11以上宏
    #define iOS11 ([[[UIDevice currentDevice]systemVersion] floatValue] >= 11.0)
    #define IOS10 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10)
    #define IOS9 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9)
    #define IOS8 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8)
    #define IOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7)
    #define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
    #define iPhone6 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(750, 1334), [[UIScreen mainScreen] currentMode].size) : NO)
    #define iPhonePlus ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2208), [[UIScreen mainScreen] currentMode].size) : NO)
    
    #define iPhone_X ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? ((CGSizeEqualToSize(CGSizeMake(750, 1624), [[UIScreen mainScreen] currentMode].size))||(CGSizeEqualToSize(CGSizeMake(828, 1792), [[UIScreen mainScreen] currentMode].size))||(CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size))||(CGSizeEqualToSize(CGSizeMake(1242, 2688), [[UIScreen mainScreen] currentMode].size))) : NO)
    
    //#MARK: 尺寸信息配置
    #define kScreenWidth [UIScreen mainScreen].bounds.size.width
    #define kScreenHeight [UIScreen mainScreen].bounds.size.height
    #define kScaleW MIN(kScreenWidth,kScreenHeight) / 375.0
    #define kScaleH MAX(kScreenWidth,kScreenHeight) / 667.0
    #define KWScale(x) x*kScaleW
    
    /// 比例尺寸 (取MIN 防止横屏比例尺变更)
    #define kRealValueWidthIn6(w) ((MIN(kScreenWidth,kScreenHeight)/375.0)*(w))
    /// 比例size
    #define kRealValueSizeIn6(w,h) CGSizeMake(kRealValueWidthIn6(w), kRealValueWidthIn6(h))
    
    
    #define kBottomSafty              (iPhone_X ? (34):(0))
    #define kStatusSafty              (iPhone_X ? (22):(0))
    // 状态栏高度
    #define kStatusBarHeight          (iPhone_X ? (44):(20))
    // 状态栏+导航栏高度
    #define kNavBarHeight             (iPhone_X ? 88.f : 64.f)
    // 底部标签栏高度
    #define kTabBarHeight             (iPhone_X ? (49.f+34.f) : 49.f)
    #define HTDiscoverHeight          (iPhone_X ? (49.f+34.f) : 0)
    #define MSWidth                   iPhonePlus ? 412 : 372
    
    #define phone_status_height [[UIApplication sharedApplication] statusBarFrame].size.height
    #define phone_navBar_height self.navigationController.navigationBar.frame.size.height
    
    //#MARK: 字体信息配置
    #define FONT(F)                   [UIFont fontWithName:@"PingFangSC-Regular" size:F*kScaleW]
    #define FONT_Medium(F)           [UIFont fontWithName:@"PingFangSC-Medium" size:F*kScaleW]
    #define FONTBOLD(F)               [UIFont fontWithName:@"PingFangSC-Semibold" size:F*kScaleW]
    #define HCBOLD(F)                 [UIFont fontWithName:@"HelveticaNeue-CondensedBold" size:F*kScaleW]
    #define kFONT(F)                  [UIFont fontWithName:@"PingFangSC-Regular" size:F]
    #define kFONT_Medium(F)           [UIFont fontWithName:@"PingFangSC-Medium" size:F]
    #define kFONT_SC(F)                [UIFont fontWithName:@"PingFangSC" size:F*kScaleW]
    
    //#MARK: 颜色信息配置
    //#MARK: 背景颜色
    /// 灰底
    #define kGrayBackgroundColor        hexColor(#F8F9FA)
    #define kGrayLightBackgroundColor   hexColor(#EEEEEE)
    /// 白底
    #define kWhiteBackgroundColor       hexColor(#FFFFFF)
    /// 透明
    #define kClearBackgroundColor       [UIColor clearColor]
    /// 黄底
    #define kYellowBackgroundColor      hexColor(#F3B61F)
    /// 蓝底
    #define KBlueBackgroundColor        hexColor(#A095FF)
    /// 浅蓝底
    #define KBlueLightBackgroundColor   hexColor(#6F62F9)
    
    //#MARK: 分割线颜色
    /// 灰线
    #define kGrayLineColor              hexColor(#D9D9D9)
    #define kGrayLightLineColor         hexColor(#F4F4F4)
    
    //#MARK: 字体颜色
    /// 黑字
    #define kBlackWordColor             hexColor(#262626)
    /// 灰字
    #define kDarkGrayWordColor          hexColor(#929292)
    #define kGrayWordColor              hexColor(#A8A8A8)
    #define kGrayLightWordColor         hexColor(#666666)
    /// 白字
    #define kWhiteWordColor             hexColor(#FFFFFF)
    /// 红字
    #define kRedWordColor               hexColor(#F40000)
    /// 黄字
    #define kYellowWordColor            hexColor(#F3B61F)
    /// 蓝字
    #define KBlueWordColor              hexColor(#6248FF)
    

    相关文章

      网友评论

        本文标题:各种常用的命令宏:状态栏高度等等(Objective-C、Swi

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