如何在不将其隐藏在iOS中的情况下禁用键盘?

时间:2017-03-03 07:13:25

标签: ios swift

我有一个包含各种元素的屏幕,包括UITextField,我想在屏幕上显示教练标记(我使用Instructions库)。但是,当显示教练标记时,我需要冻结与元素的交互(例如,用户不能在文本字段中键入内容)。

我的问题在于键盘(它始终显示在此屏幕中):如果我只是将文本字段的isEnabled属性设置为false,或者设置isUserInteractionEnabled = false,则该字段将终止第一个响应者并且键盘消失,这个屏幕不自然。但是,如果我使用textField:shouldChangeCharactersIn范围:委托方法并返回false,则键盘仍然可见,但已启用。因此,当教练标记出现时,用户可以敲击键盘。虽然这对文本字段没有影响,但它仍然很奇怪而且很烦人。

那么我该如何暂时保持键盘,但禁用它(最好是在教练标记模糊视图后面)?我看到了this,但这并没有提供我认为Apple会接受的解决方案。

谢谢,

Yariv。

2 个答案:

答案 0 :(得分:1)

您可以在键盘可见时动态添加UIButton。您可以添加keyboardDidShow& keyboardDidHide观察者知道键盘何时启动并可见。

您可能会面临与键盘在屏幕上最顶层相关的问题,但您可以通过在当前视图/窗口中将新添加的UIButton置于最顶层来处理它。

不要忘记为userInteractionEnabled

false设为UIButton

@MikeAlter对您的问题的评论将是最好的(也是干净的)解决方案。但是,这也意味着您无法控制导航/与屏幕上的其他控件进行交互。

修改

键盘在显示时屏幕上显示特定区域。我的解决方案建议您可以在视图上添加UIButton,其精确的矩形/框架与键盘相同。一个覆盖整个键盘的视图/按钮。因此,您的键盘不会进行任何用户交互。

以下代码可以帮助您获得键盘的大小。您可以在完全相同的位置添加相同大小的UIButton,这会使您的键盘处于非活动状态,因为按钮本身会处理用户交互。

- (void)keyboardDidShow:(NSNotification *)notification {
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    int height = MIN(keyboardSize.height,keyboardSize.width);
    int width = MAX(keyboardSize.height,keyboardSize.width);

    ... Add UIButton here with the CGRect of keyboard
}

您需要注册UIKeyboardDidShowNotification以便上述工作,例如:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardDidShow:)
                                             name:UIKeyboardDidShowNotification
                                           object:nil];

答案 1 :(得分:0)

如果你想让键盘在教练标记后面模糊视图,那么将教练标记模糊视图添加到最后一个窗口:

UIApplication.shared.windows.last?.addSubview(coachMarksBlurView)
UIApplication.shared.keyWindow?.bringSubview(toFront: coachMarksBlurView)

如果你想阻止键盘,你可以使用这两个功能:

func addBlockView(){
    view.addSubview(viewBlock)
    viewBlock.frame = CGRect.init(x: 0, y: 0, w: 
    UIScreen.main.bounds.size.width, h: 
    UIScreen.main.bounds.size.height)
    viewBlock.backgroundColor = UIColor.clear
    UIApplication.shared.windows.last?.addSubview(viewBlock)
    UIApplication.shared.keyWindow?.bringSubview(toFront: viewBlock)
}

func removeBlockView(){
    viewBlock.removeFromSuperview()
}