我有一个包含各种元素的屏幕,包括UITextField,我想在屏幕上显示教练标记(我使用Instructions库)。但是,当显示教练标记时,我需要冻结与元素的交互(例如,用户不能在文本字段中键入内容)。
我的问题在于键盘(它始终显示在此屏幕中):如果我只是将文本字段的isEnabled属性设置为false,或者设置isUserInteractionEnabled = false,则该字段将终止第一个响应者并且键盘消失,这个屏幕不自然。但是,如果我使用textField:shouldChangeCharactersIn范围:委托方法并返回false,则键盘仍然可见,但已启用。因此,当教练标记出现时,用户可以敲击键盘。虽然这对文本字段没有影响,但它仍然很奇怪而且很烦人。
那么我该如何暂时保持键盘,但禁用它(最好是在教练标记模糊视图后面)?我看到了this,但这并没有提供我认为Apple会接受的解决方案。
谢谢,
Yariv。
答案 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()
}