【问题标题】:UITextView's inputView on iOS 7iOS 7 上 UITextView 的 inputView
【发布时间】:2013-09-24 14:33:03
【问题描述】:

我正在尝试为 UITextField 创建自定义键盘,此 inputView 的背景应该是透明的,我已将视图的 xib 文件中的背景颜色设置为“清除颜色”。它在 iOS 6 及更早版本上运行良好.. 但在 iOS 7 上它不起作用 知道如何使它工作吗?我希望它完全透明

【问题讨论】:

    标签: iphone ios uitextfield custom-controls ios7


    【解决方案1】:

    这将在显示自定义键盘时将背景不透明度设置为零,并在显示普通键盘时将其重置为 1。

    + (void)updateKeyboardBackground {
        UIView *peripheralHostView = [[[[[UIApplication sharedApplication] windows] lastObject] subviews] lastObject];
    
        UIView *backdropView;
        CustomKeyboard *customKeyboard;
    
        if ([peripheralHostView isKindOfClass:NSClassFromString(@"UIPeripheralHostView")]) {
            for (UIView *view in [peripheralHostView subviews]) {
                if ([view isKindOfClass:[CustomKeyboard class]]) {
                    customKeyboard = (CustomKeyboard *)view;
                } else if ([view isKindOfClass:NSClassFromString(@"UIKBInputBackdropView")]) {
                    backdropView = view;
                }
            }
        }
    
        if (customKeyboard && backdropView) {
            [[backdropView layer] setOpacity:0];
        } else if (backdropView) {
            [[backdropView layer] setOpacity:1];
        }
    }
    
    + (void)keyboardWillShow {
        [self performSelector:@selector(updateKeyboardBackground) withObject:nil afterDelay:0];
    }
    
    + (void)load {
        NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
        [nc addObserver:self selector:@selector(keyboardWillShow) name:UIKeyboardWillShowNotification object:nil];
    }
    

    【讨论】:

      【解决方案2】:

      我正在寻找同样的问题,因为我有一个数字键盘,它在横向模式下仅填充屏幕的左半部分(并且在模糊效果覆盖整个屏幕宽度的 iOS7 上基本上无法使用)。我还没有完全弄清楚如何得到我想要的(模糊的背景只在我的实际 inputView 后面),但我已经弄清楚了如何完全禁用模糊:

      1. 定义 UIView 的自定义子类并在您的 xib 文件中指定它
      2. 在这个类中重写 willMoveToSuperview: 如下

        - (void)willMoveToSuperview:(UIView *)newSuperview
        {
            if (UIDevice.currentDevice.systemVersion.floatValue >= 7 &&
                newSuperview != nil)
            {
                CALayer *layer = newSuperview.layer;
                NSArray *subls = layer.sublayers;
                CALayer *blurLayer = [subls objectAtIndex:0];
                [blurLayer setOpacity:0];
            }
        }
        

      这似乎会影响我拥有的每个自定义 inputView 的背景(但不影响系统键盘),因此如果您不希望从超级视图中删除 inputView 时,您可能需要保存/恢复正常的不透明度值那。

      【讨论】:

        【解决方案3】:

        iOS 7 在幕后做了一些没有记录的事情。但是,您可以通过在自定义输入视图中覆盖 -willMoveToSuperview 来检查视图层次结构并调整相关视图。例如,此代码将使背景透明:

        - (void)willMoveToSuperview:(UIView *)newSuperview {
        
            NSLog(@"will move to superview of class: %@ with sibling views: %@", [newSuperview class], newSuperview.subviews);
        
            if ([newSuperview isKindOfClass:NSClassFromString(@"UIPeripheralHostView")]) {
        
                UIView* aSiblingView;
                for (aSiblingView in newSuperview.subviews) {
                    if ([aSiblingView isKindOfClass:NSClassFromString(@"UIKBInputBackdropView")]) {
                        aSiblingView.alpha = 0.0;
                    }
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-23
          相关资源
          最近更新 更多