iOS判断是否是手写键盘

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS判断是否是手写键盘相关的知识,希望对你有一定的参考价值。

github:

思路:遍历键盘window的subviews,如果发现UIKBHandwritingView,则当前键盘为手写键盘;

手写键盘的位置:

UIRemoteKeyboardWindow  

  UIInputSetContainerView

    UIInputSetHostView

      _UIKBCompatInputView

        UIKeyboardAutomatic

          UIKeyboardImpl

            UIKeyboardLayoutStar

              UIKBKeyplaneView

                UIKBHandwritingView

                UIKBHandwritingCandidateView

 

 

注意,上图显示UIKeyboardLayoutStar是UIKeyboardImpl的第一个view,但是iPad的实际如下图:

// 思路:判断有没有UIKBHandwritingView,遍历所有view

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

{

#warning 担心苹果改变键盘结构,没有取到UIKBHandwritingView;造成无法消费!

 

    NSString *yuan = @"邓超界";

    if (![string isEqualToString:yuan]) {

        [SVProgressHUD showErrorWithStatus:@"签名不是持卡人姓名,请重写;如果不是手写键盘,请长按或者点击键盘上左下角的地球图标,选择 简体手写"];

        textField.text = @"";

        return NO;

    }

    if ([string isEqualToString:@"\\n"]) {

        return NO;

    }

    // 判断有没有UIKBHandwritingView  遍历所有view

    UIView *handwritingView;

    for (UIWindow *keyboardWindow in [[UIApplication sharedApplication] windows]) {

        if ([[keyboardWindow description] hasPrefix:@"<UIRemoteKeyboardWindow"] == YES) {

            for (UIView *setContainer in keyboardWindow.subviews) {

                if ([[setContainer description] hasPrefix:@"<UIInputSetContainerView"] == YES) {

                    for (UIView *setHost in setContainer.subviews) {

                        if ([[setHost description] hasPrefix:@"<UIInputSetHostView"] == YES) {

                            for (UIView *compat in setHost.subviews) {

                                if ([[compat description] hasPrefix:@"<_UIKBCompatInputView"] == YES) {

                                    for (UIView *automatic in compat.subviews) {

                                        if ([[automatic description] hasPrefix:@"<UIKeyboardAutomatic"] == YES) {

                                            for (UIView *lmpl in automatic.subviews) {

                                                if ([[lmpl description] hasPrefix:@"<UIKeyboardImpl"] == YES) {

                                                    for (UIView *layoutStar in lmpl.subviews) {

                                                        if ([[layoutStar description] hasPrefix:@"<UIKeyboardLayoutStar"] == YES) {

                                                            for (UIView *plane in layoutStar.subviews) {

                                                                if ([[plane description] hasPrefix:@"<UIKBKeyplaneView"] == YES) {

                                                                    for (UIView *view in plane.subviews) {

                                                                        if([[view description] hasPrefix:@"<UIKBHandwritingView"] == YES){

                                                                            handwritingView = view;

                                                                            break;

                                                                        }

                                                                    }

                                                                    break;

                                                                }

                                                            }

                                                            break;

                                                        }

                                                    }

                                                    break;

                                                }

                                            }

                                            break;

                                        }

                                    }

                                    break;

                                }

                            }

                            break;

                        }

                    }

                    break;

                }

            }

            break;

        }

    }

 

    if (handwritingView) {

        // 截屏

        [self printscreenOfView:handwritingView];

        [SVProgressHUD showSuccessWithStatus:@"签名正确"];

    }else

    {

        [SVProgressHUD showInfoWithStatus:@"请长按或者点击键盘上左下角的地球图标,切换键盘为 简体手写"];

        textField.text = @"";

        return NO;

    }

    return YES;

}

 

 

 

for in,如果遍历的数组元素个数为零,不会执行遍历; 

break终止循环执行循环体下面的代码
return终止循环并且退出循环所在的方法
continue终止当前循环,进行下一次循环

 

以上是关于iOS判断是否是手写键盘的主要内容,如果未能解决你的问题,请参考以下文章

手写IOC-SPRINGPMVC-CONNPOOL

纯手写实现HashMap

安卓系统有支持手写输入数学公式的软件吗

手写平衡二叉树

JS基础 - 手写深度比较isEqual

给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内,给出思路并手写代码