【问题标题】:iOS 8 custom input view background coloriOS 8 自定义输入视图背景颜色
【发布时间】:2014-11-17 22:31:20
【问题描述】:

我有一个自定义输入视图,我用 iOS 键盘替换了它。在 iOS 8 之前,对于 iOS 7,我通过查找 UIKBInputBackdropView 类的子视图(由 UIPeripheralHostView 包含)来“找出”键盘背景。然后我可以设置背景视图的 alpha 以获得清晰的自定义输入视图背景。

在 iOS 8 中,这不再有效(我意识到它是不受支持的 API,这就是风险)。通过一些实验和阅读,似乎自定义输入视图现在可以在视图层次结构中找到:

UIInputSetContainerView -> UIInputSetHost

看起来不再有背景视图在自定义输入视图后面提供不透明度。有人能指出我如何摆脱自定义输入视图背后的半透明/模糊效果吗?

【问题讨论】:

    标签: background keyboard ios8


    【解决方案1】:

    我在 iOS 8 上遇到了同样的问题,并且有办法从输入视图中删除背景。

    - (void)removeKeyboardBackground
    {
        // Locate non-UIWindow.
        UIWindow *keyboardWindow = nil;
        for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) {
            if (![[testWindow class] isEqual:[UIWindow class]]) {
                keyboardWindow = testWindow;
                break;
            }
        }
        // Locate background.
        for (UIView *possibleFormView in [keyboardWindow subviews]) {
            if ([[possibleFormView description] hasPrefix:@"<UIInputSetContainerView"]) {
                for (UIView* peripheralView in possibleFormView.subviews) {
                    if ([[peripheralView description] hasPrefix:@"<UIInputSetHostView"]) {
                        for (UIView* backSubiview in peripheralView.subviews) {
    
                        if ([[backSubiview description] hasPrefix:@"<UIKBInputBackdropView"]) {
                            [[backSubiview layer] setOpacity:0.0];
                        }
                    }
                    }
    
                }
            }
        }
    }
    

    【讨论】:

    • 您是在将加载自定义输入视图的主视图中还是在自定义输入视图本身中使用此方法?我都试过了,不幸的是我仍然得到灰色的背景。任何帮助将不胜感激!
    • 你找到iOS9的解决方案了吗?
    【解决方案2】:

    我为更高版本的 iOS 使用了已接受答案的变体。看起来苹果现在已经将 UIKBInputBackdropView 推到了另一个 UIView 下:

    #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:(v) options:NSNumericSearch] != NSOrderedAscending)
    
    - (void)removeKeyboardBackground
    {
        NSString *viewPath;
    
        if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"11.0"))
            viewPath = @"UIRemoteKeyboardWindow/UIInputSetContainerView/UIInputSetHostView/UIView/UIKBInputBackdropView";
        else
            viewPath = @"UIRemoteKeyboardWindow/UIInputSetContainerView/UIInputSetHostView/UIKBInputBackdropView";
    
        NSArray *appWindows = [NSMutableArray arrayWithArray:[[UIApplication sharedApplication] windows]];
        NSArray *viewsFound = [self viewsFromViews:appWindows AtPath:[viewPath componentsSeparatedByString:@"/"]];
    
        for (UIView *background in viewsFound)
            background.layer.opacity = 0.0;
    }
    
    - (NSArray<__kindof UIView *> *)viewsFromViews:(NSArray<__kindof UIView *> *)views AtPath:(NSArray<NSString *> *)path
    {
        NSMutableArray *viewsFound = [NSMutableArray array];
    
        if (views != nil && path != nil && [views count] > 0 && [path count] > 0)
        {
            NSString *prefix = [@"<" stringByAppendingString:[path firstObject]];
            NSArray *pathRemaining = [path count] <= 1 ? nil : [path subarrayWithRange:NSMakeRange(1, [path count] - 1)];
    
            for (UIView *view in views)
                if ([[view description] hasPrefix:prefix]) {
                    if (pathRemaining == nil)
                        [viewsFound addObject:view];
                    else
                        [viewsFound addObjectsFromArray:[self viewsFromViews:[view subviews] AtPath:pathRemaining]];
                }
        }
    
        return viewsFound;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      相关资源
      最近更新 更多