美文网首页
对第三方键盘的输入控制

对第三方键盘的输入控制

作者: 大猿媛 | 来源:发表于2017-05-25 15:34 被阅读389次

    背景

    项目开发中,有时候会遇到一些输入要做特殊限制或处理,比如禁止输入中文,禁止粘贴等,本来我们可以通过系统方法设置keyboardType限制输入类型,和 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender实现禁止粘贴;可是坑点在于,有些用户下载了搜狗输入法,以上方法就不攻自破了

    普及一下常用的系统键盘

    1、限制不能输入汉字:UIKeyboardTypeASCIICapable
    2、中文键盘:UIKeyboardTypeNamePhonePad
    3、数字键盘:UIKeyboardTypeNumberPad
    4、搜索网页键盘:UIKeyboardTypeWebSearch
    5、邮箱键盘: UIKeyboardTypeEmailAddress

    换个思路,没法控制键盘,控制输入框的内容也可以啊

    UITextFiled和UITextView是我们常用的文本输入控件,控制其输入的方法就是代理方法

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;   // return NO to not change text
    
    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;
    

    这两个方法中,每次文本框插入新的字符串都会调用,且插入的字符串我们可以获取,所以:
    1、禁止输入中文,我们可以检测string或者text如果包含中文,就返回YES即可
    2、禁止粘贴,先来普及一下系统粘贴板的知识
    2.1 UIPasteboard类有3个初始化方法,如下:

    //获取系统级别的剪切板
    + (UIPasteboard *)generalPasteboard;
    //获取一个自定义的剪切板 name参数为此剪切板的名称 create参数用于设置当这个剪切板不存在时 是否进行创建
    + (nullable UIPasteboard *)pasteboardWithName:(NSString *)pasteboardName  create:(BOOL)create;
    //获取一个应用内可用的剪切板
    + (UIPasteboard *)pasteboardWithUniqueName;
    

    2.2 获取剪切板上的内容

    //获取或设置剪切板中的字符串数据
    @property(nullable,nonatomic,copy) NSString *string;
    //获取或设置剪切板中的字符串数组
    @property(nullable,nonatomic,copy) NSArray<NSString *> *strings;
    //获取或设置剪切板中的URL数据
    @property(nullable,nonatomic,copy) NSURL *URL;
    //获取或设置剪切板中的URL数组
    @property(nullable,nonatomic,copy) NSArray<NSURL *> *URLs;
    //获取或s何止剪切板中的图片数据
    @property(nullable,nonatomic,copy) UIImage *image;
    //获取或设置剪切板中的图片数组
    @property(nullable,nonatomic,copy) NSArray<UIImage *> *images;
    //获取或设置剪切板中的颜色数据
    @property(nullable,nonatomic,copy) UIColor *color;
    //获取或设置剪切板中的颜色数组
    @property(nullable,nonatomic,copy) NSArray<UIColor *> *colors;
    
    //部分代码参考
    - (BOOL)canBecomeFirstResponder {
        return YES;
    }
    - (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
            //action 会返回很多,想用哪个就写那个(action == @selector(cut:) )
        return (action == @selector(copy:) || action == @selector(paste:) );
    }
    -(void)copy:(id)sender{
        UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];
        [pasteboard setImage:self.image];
        if ([self.delegate respondsToSelector:@selector(transSomeTing:)]) {
            [self.delegate transSomeTing:pasteboard.image];
            NSLog(@"%@",self.image);
        }
        NSLog(@"您点击的是拷贝%@",pasteboard.items);
    }
    -(void)paste:(id)sender{
        UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];
        UIImage *image = [pasteboard image];
        if (image) {
            self.image = image;
        }
        NSLog(@"您点击的是粘贴");
    }
    - (void)cut:(id)sender {
    
        UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
        [pasteboard setImage:self.image];
        NSLog(@"您点击的是剪切");
    }
    - (void)select:(id)sender {
    
        NSLog(@"您点击的是选择");
    }
    -(void)selectAll:(id)sender {
    
        NSLog(@"您点击的是全选");
    }
    

    3、禁止粘贴,第三方键盘有自己的粘贴按钮,不会走canPerformAction方法,同样我们也是在textView或者textField的代理方法中做拦截, 如果要插入的字符串和粘贴板上的字符串一样,就说明插入的内容来自剪切板,返回NO

    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
    
        if ([text isEqualToString:[[UIPasteboard generalPasteboard]string]]) {
            [SVProgressHUD showInfoWithStatus:@"禁止粘贴"];
            return NO;
        }
        
        if ([ZKHelper includeChinese:text]) {
            [SVProgressHUD showInfoWithStatus:@"该题型只支持输入英文"];
            return NO;
        }
        return YES;
    }
    
    //是否含有中文
    + (BOOL)includeChinese:(NSString*)str
    {
        for(int i=0; i< [str length];i++)
        {
            int a =[str characterAtIndex:i];
            // || (a >= 48 && a <= 57)
            if( (a >0x4e00&& a <0x9fff)){
                return YES;
            }
        }
        return NO;
    }
    

    相关文章

      网友评论

          本文标题:对第三方键盘的输入控制

          本文链接:https://www.haomeiwen.com/subject/vahzxxtx.html