如何获得keyWindow

简介: 如何获得keyWindow

由于iOS13及以后引入了SceneDelegate,导致不能通过原来的[UIApplication sharedApplication].keyWindow直接获取到正确的keyWindow。需要区分系统来获取。具体的实现如下:

/** 获取 keyWindow */
static inline UIWindow *BRGetKeyWindow(void) {
    UIWindow *keyWindow = nil;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 // 编译时检查SDK版本:Xcode11+编译会调用(iOS SDK 13.0 以后版本的处理)
    if (@available(iOS 13.0, *)) {
        NSSet<UIScene *> *connectedScenes = [UIApplication sharedApplication].connectedScenes;
        for (UIScene *scene in connectedScenes) {
            if (scene.activationState == UISceneActivationStateForegroundActive && [scene isKindOfClass:[UIWindowScene class]]) {
                UIWindowScene *windowScene = (UIWindowScene *)scene;
                for (UIWindow *window in windowScene.windows) {
                    if (window.isKeyWindow) {
                        keyWindow = window;
                        break;
                    }
                }
            }
        }
    } else
#endif
    {
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 130000
        return [UIApplication sharedApplication].keyWindow;
#endif
    }
    
    return keyWindow;
}

内联函数的使用和宏类似,它主要为了代替无检查机制的宏,具体使用如下:

#define Base_BottomHeight ([FMConfig config].safeBottomHeight)
// 底部安全区域高度
#define BR_BOTTOM_MARGIN \
({CGFloat safeBottomHeight = 0;\
if (@available(iOS 11.0, *)) {\
safeBottomHeight = BRGetKeyWindow().safeAreaInsets.bottom;\
}\
(safeBottomHeight);})


目录
相关文章
|
Web App开发 Android开发 iOS开发
iOS 调试:通过 Safari/Chrome 调试 WebView
iOS 调试:通过 Safari/Chrome 调试 WebView
10834 123
iOS 调试:通过 Safari/Chrome 调试 WebView
|
iOS开发
iOS 富文本添加点击事件
iOS 富文本添加点击事件
1997 0
iOS 富文本添加点击事件
|
Web App开发 前端开发 Android开发
iOS 唤起 APP: Universal Link(通用链接)(下)
iOS 唤起 APP: Universal Link(通用链接)(下)
2178 0
iOS 唤起 APP: Universal Link(通用链接)(下)
|
iOS开发
IOS编译出现Command PhaseScriptExecution failed with a nonzero exit code
IOS编译出现Command PhaseScriptExecution failed with a nonzero exit code
3798 2
|
存储 iOS开发 Perl
ios-解决报错-CocoaPods could not find compatible versions for pod “xxx“
ios-解决报错-CocoaPods could not find compatible versions for pod “xxx“
1251 2
使用序列化和反序列化函数archivedDataWithRootObject和unarchivedObjectOfClasses的使用和遇到问题及解决方案
使用序列化和反序列化函数archivedDataWithRootObject和unarchivedObjectOfClasses的使用和遇到问题及解决方案
593 0
|
自然语言处理 程序员 开发工具
iOS生成Bundle 资源文件包与使用
iOS生成Bundle 资源文件包与使用
987 0
|
开发框架 前端开发 Swift
SwiftUI的优缺点
SwiftUI的优缺点
929 0
|
iOS开发 Windows
iOS使用SceneDelegate
xcode11创建项目新增SceneDelegate文件,AppDelegate文件结构也发生变化,在AppDelegate.h文件中没有了window属性,而是在SceneDelegate.h中,可见AppDelegate不管理window而是交给SceneDelegate。由于这些是ios13新增,所以SceneDelegate在ios13以下的系统是不支持。
1156 0
iOS使用SceneDelegate