ChenYilong / CYLTabBarController

[EN]It is an iOS UI module library for adding animation to iOS tabbar items and icons with Lottie, and adding a bigger center UITabBar Item. [CN]【中国特色 TabBar】一行代码实现 Lottie 动画TabBar,支持中间带+号的TabBar样式,自带红点角标,支持动态刷新。【iOS13 & Dark Mode & iPhone XS MAX supported】
MIT License
6.91k stars 1.45k forks source link

[bug]:iOS 13 不适配的解决方案 #533

Closed 295060456 closed 3 years ago

295060456 commented 3 years ago

//建议往最高处定义,全局引用

static inline UIWindow * getMainWindow(){
    UIWindow *window = nil;
    if (@available(iOS 13.0, *)) {
        window = [SceneDelegate sharedInstance].window;
    }else{
        window = UIApplication.sharedApplication.delegate.window;
//        [UIApplication sharedApplication].keyWindow
    }return window;
}

同时将- (CYLTabBarController *)cyl_tabBarController 里面进行替换

- (CYLTabBarController *)cyl_tabBarController {
    CYLTabBarController *tabBarController;
    id (^block)(void) = objc_getAssociatedObject(self, @selector(cyl_tabBarController));
    tabBarController = (block ? block() : nil);
    if (tabBarController && [tabBarController isKindOfClass:[CYLTabBarController class]]) {
        return tabBarController;
    }
    if ([self isKindOfClass:[UIViewController class]] && [(UIViewController *)self parentViewController]) {
        tabBarController = [[(UIViewController *)self parentViewController] cyl_tabBarController];
        if ([tabBarController isKindOfClass:[CYLTabBarController class]]) {
            return tabBarController;
        }
    }

    UIViewController *rootViewController = [getMainWindow().rootViewController cyl_getViewControllerInsteadOfNavigationController];;
    if ([rootViewController isKindOfClass:[CYLTabBarController class]]) {
        tabBarController = (CYLTabBarController *)rootViewController;
    }
    return tabBarController;
}
ChenYilong commented 3 years ago

@295060456 多谢指正 , 代码改为下面这几种,是否更为通用?

因为 SceneDelegate 是一个工程里自定义的类名, 可以获取更通用的:

static inline UIWindow *getMainWindow(){
   UIWindow *window = nil;
    window = UIApplication.sharedApplication.delegate.window;
    if (!window) {
        if (@available(iOS 13.0, *)) {
            NSSet<UIScene *> *connectedScenes =  UIApplication.sharedApplication.connectedScenes;
            if (connectedScenes.count > 0 ) {
                UIWindowScene *scene = (UIWindowScene *)connectedScenes.anyObject;
                 window = scene.windows.firstObject;
            }
        }
    }
    return window;
}

或者

static inline UIWindow *getMainWindow(){
   UIWindow *window = nil;
    window = UIApplication.sharedApplication.delegate.window;
    if (!window) {
        if (@available(iOS 13.0, *))
           {
               for (UIWindowScene* wScene in [UIApplication sharedApplication].connectedScenes)
               {
                   if (wScene.activationState == UISceneActivationStateForegroundActive)
                   {
                       window = wScene.windows.firstObject;

                       break;
                   }
               }
           }
    }
    return window;
}

代码来源参考:https://stackoverflow.com/questions/57009283/how-get-current-keywindow-equivalent-for-multi-window-scenedelegate-xcode-11

295060456 commented 3 years ago

window = UIApplication.sharedApplication.delegate.window; 有时候是拿不到值的,会出问题。我刚好碰上。你直接拉我给你的地址,将会看到效果

295060456 commented 3 years ago

ios 13以后 用 SceneDelegate 来管理

ChenYilong commented 3 years ago

新版本v1.29.1中已修复 

变更记录见: https://github.com/ChenYilong/CYLTabBarController/commit/062ad52c9cb0cee9fabbb9de6c3a0ad893713d86