iOS 26系统QMUI无法获取到键盘问题处理

0 阅读1分钟

这个问题的原因是iOS26的键盘UI名字改为了UIKeyboardItemContainerView(实际上这个类也是继承UIInputSetHostView的,但是QMUI中是通过类名匹配的所以匹配不到了导致找不到键盘。。尴尬)直接看代码把

+ (UIView *)keyboardView {
    UIView *inputSetHostView = [[UIApplication.sharedApplication.windows qmui_filterWithBlock:^BOOL(__kindof UIWindow * _Nonnull window) {
        return [NSStringFromClass(window.class) isEqualToString:@"UIRemoteKeyboardWindow"];
    }] qmui_compactMapWithBlock:^id _Nullable(__kindof UIWindow * _Nonnull window) {
        return [self inputSetHostViewInWindow:window];
    }].firstObject;
    
    if (inputSetHostView) return inputSetHostView;
    
    inputSetHostView = [[UIApplication.sharedApplication.windows qmui_filterWithBlock:^BOOL(__kindof UIWindow * _Nonnull window) {
        return [NSStringFromClass(window.class) isEqualToString:@"UITextEffectsWindow"];
    }] qmui_compactMapWithBlock:^id _Nullable(__kindof UIWindow * _Nonnull window) {
        if (@available(iOS 26.0, *)) {
            return [self inputSetHostViewInGlassWindow:window];
        } else {
            return [self inputSetHostViewInWindow:window];
        }
    }].firstObject;
    
    return inputSetHostView;
}

+ (UIView *)inputSetHostViewInWindow:(UIWindow *)window {
    UIView *result = [[window.subviews qmui_firstMatchWithBlock:^BOOL(__kindof UIView * _Nonnull subview) {
        return [NSStringFromClass(subview.class) isEqualToString:@"UIInputSetContainerView"];
    }].subviews qmui_firstMatchWithBlock:^BOOL(__kindof UIView * _Nonnull subview) {
        return [NSStringFromClass(subview.class) isEqualToString:@"UIInputSetHostView"] && subview.subviews.count;
    }];
    return result;
}

+ (UIView *)inputSetHostViewInGlassWindow:(UIWindow *)window {
    UIView *result = [[window.subviews qmui_firstMatchWithBlock:^BOOL(__kindof UIView * _Nonnull subview) {
        return [NSStringFromClass(subview.class) isEqualToString:@"UITrackingWindowView"];
    }].subviews qmui_firstMatchWithBlock:^BOOL(__kindof UIView * _Nonnull subview) {
        return [NSStringFromClass(subview.class) isEqualToString:@"UIKeyboardItemContainerView"] && subview.subviews.count;
    }];
    return result;
}