如何禁用键盘而不将其隐藏在iOS中?

如何禁用键盘而不将其隐藏在iOS中?,ios,swift,Ios,Swift,我有一个包含各种元素的屏幕,包括UITextField,我想在屏幕上显示coach标记(我正在使用库)。但是,我需要在显示coach标记时冻结与元素的交互(例如,用户不能在文本字段中键入内容) 我的问题是键盘(始终显示在此屏幕中):如果我只是将文本字段的isEnabled属性设置为false,或将isUserInteractionEnabled=false,则该字段将退出first responder,键盘将消失,这对于此屏幕来说是不自然的。但是,如果我在range:delegate方法中使用t

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

我的问题是键盘(始终显示在此屏幕中):如果我只是将文本字段的isEnabled属性设置为false,或将isUserInteractionEnabled=false,则该字段将退出first responder,键盘将消失,这对于此屏幕来说是不自然的。但是,如果我在range:delegate方法中使用textField:shouldChangeCharacters并返回false,键盘将保持可见,但已启用。因此,当coach标记出现时,用户可以点击键盘。虽然这对文本字段没有影响,但它仍然很奇怪和恼人

那么,我如何暂时保持键盘,但将其禁用(最好是在coach标记模糊视图后面)?我看到了,但这并不能提供一个我认为苹果会接受的解决方案

谢谢


Yariv.

当键盘可见时,您可以动态添加
ui按钮。您可以添加
keyboardidshow
keyboardidhide
观察者,以了解键盘何时启动并可见

您可能会遇到键盘在屏幕上位于最顶端的问题,但您可以通过将新添加的
ui按钮设置为当前视图/窗口的最顶端来解决此问题

不要忘记将
ui按钮的
userInteractionEnabled
设置为
false

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


编辑

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

下面的代码可以获得键盘的大小。您可以在完全相同的位置添加大小相同的
ui按钮
,这将使键盘处于非活动状态,因为用户交互将由按钮本身负责

- (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];

如果要使“coach marks blur”视图后面的键盘模糊,请将“coach marks blur”视图添加到最后一个窗口:

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()
}

Try textField.resignFirstResponder=true它将删除键盘Try self.view.endEditing(true)您只需在显示帮助内容时禁用主窗口(AppDelegate的窗口对象)的用户交互,并在完成Jignesh时启用-整个要点不是隐藏键盘。拉杰什库马尔:这也取消了键盘,还有一个额外的缺点,即文本字段失去焦点,当coach标记被取消时,用户必须重新点击它。迈克:这似乎是最好、最清楚的答案。然而,不幸的是,这似乎也调用了resignFirstResponder,而且,甚至最糟糕的是,coach标记自己没有响应,用户也不能将其驳回。我不确定我是否理解您的意思-您的意思是添加一个将成为FirstResponder本身的UIButton吗?这对我有什么帮助?当我调用userInteractionEnabled=false时,键盘消失也会有同样的问题,不是吗?UIButton能否成为第一响应者(显示键盘)?也许我不明白你的解决方案,如果你能更具体一点,我将不胜感激。谢谢