iOS判断是否是手写键盘
2017-08-03 11:46 dengchaojie_learner 阅读(832) 评论(0) 编辑 收藏 举报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终止当前循环,进行下一次循环