美文网首页
UITextField输入框过滤表情

UITextField输入框过滤表情

作者: 文子飞_ | 来源:发表于2020-11-24 19:17 被阅读0次
UITextField输入框过滤
    UIButton* accessory = [UIButton buttonWithType:UIButtonTypeCustom];
    [accessory setImage:[UIImage imageNamed:@"icon_hide"] forState:UIControlStateNormal];
    [accessory setImage:[UIImage imageNamed:@"icon_show"] forState:UIControlStateSelected];
    accessory.width=SX(34);
    accessory.height=SY(23);
    
    _accountTxt = [[UITextField alloc]init];
    _accountTxt.rightView = accessory;
    _accountTxt.delegate = self;
    [_accountTxt addTarget:self action:@selector(accountTxtEditingChangedAction:) forControlEvents:UIControlEventEditingChanged];
    _accountTxt.keyboardType = UIKeyboardTypeNumberPad;
    _accountTxt.clearButtonMode = UITextFieldViewModeWhileEditing;
    _accountTxt.rightViewMode = UITextFieldViewModeUnlessEditing;
    _accountTxt.placeholder = @"请输入手机号/用户名";
// UITextField 禁止输入空格
- (void)accountTxtEditingChangedAction:(UITextField *)textField {
    textField.text = [textField.text stringByReplacingOccurrencesOfString:@" " withString:@""];
}

// UITextField 禁止输入空格
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSString *tem = [[string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@""];
    if (![string isEqualToString:tem]) {
        [MBProgressHUD showWarnMessage:@"用户名只能为中英文或数字"];
        return NO;
    }
    return YES;
}

// UITextField 限制只能输入数字
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    
    NSString *charactersInString = @"0123456789n";
    NSCharacterSet *set = [[NSCharacterSet characterSetWithCharactersInString:charactersInString] invertedSet];
    NSString *filteredStr = [[string componentsSeparatedByCharactersInSet:set] componentsJoinedByString:@""];
    if (![string isEqualToString:filteredStr]) {
        [MBProgressHUD showWarnMessage:@"格式有误,请输入正确的手机号"];
        return NO;
    }
    
    return [UITextField numberFormatTextField:textField shouldChangeCharactersInRange:range replacementString:string textFieldType:kPhoneNumberTextFieldType];
    
}
UITextField 输入框限制特殊字符的输入,只允许中英文及数字输入,直接上代码
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
        
    // 1. 去空格,英文输入时联想状态包含空格
    string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    
    // 2. 当输入符合规则 或者退格键 或者回车键时允许输入
    if ([self isInputCharAvailable:string] || [string isEqualToString:@""] ||  [string isEqualToString:@"\n"]) {
        return YES;
    } else {
        return NO;
    }
    
    return YES;
}
/// 输入字符是否合法 (字母、数字、中文的判断(不包括空格))
- (BOOL)isInputCharAvailable:(NSString *)str {
    // ➋➌➍➎➏➐➑➒ 中文键盘拼音9键输入
    NSString *pattern = @"^[➋➌➍➎➏➐➑➒a-zA-Z\u4E00-\u9FA5\\d]*$";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    BOOL isMatch = [pred evaluateWithObject:str];
    return isMatch;
}

坑:

中文键盘拼音9键输入,拦截到的字符是➋➌➍➎➏➐➑➒这些玩意
2.英文输入时单词联想时,前面默认多了一个空格,所以多了第一步的处理
3.对于种类繁多的特殊字符,上面的方法依然有一些漏网字符,如🉐🈵🈲🈶🈺🈸🈴,如果想赶尽杀绝,需要单独处理了

UITextField输入框过滤不想的字符串
/// 过滤不想要的特殊字符
/// @param characterString 特殊字符
- (NSString *)filterWithDoNotWantCharacterString:(NSString *)characterString
{
    // NSString *characterString = @";¥?![]{}#%^*£€•$><~|/?!@[]{}(#-%*+=)\\|~(<>$%^&*)+";
    NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:characterString];
    
    NSArray *tempStringArray = [self componentsSeparatedByCharactersInSet: doNotWant];//拆分字符串
    NSString *tempString = [tempStringArray componentsJoinedByString:@""];//数组拼接字符串
    // 这里是清理前后两端空格
    tempString = [tempString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    tempString  = [tempString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet ]];
    // [tempString stringByReplacingOccurrencesOfString:@" " withString:@""];//替换全部空格
    return  tempString;
}
UITextField 解决中文输入拼音时,计算长度问题
- (void)textFieldDidChangeSelection:(UITextField *)textField {
    UITextRange *selectedRange = [textField markedTextRange];
    NSString * newText = [textField textInRange:selectedRange];
    //获取高亮部分
    if(newText.length > 0)
    {
        return;
    }
}
Observable.of(searchTitleView.searchBar.rx.text).merge().subscribe(onNext: { [weak self] (text) in
            if var text: String = text, text.count > 15 {
                text.removeLast()
                self?.searchTitleView.searchBar.text = text
            }
        }).disposed(by: disposeBag)

func textFieldDidChangeSelection(_ textField: UITextField) {
        // 预输入拼音时,不需要处理
        if let selectedRange = textField.markedTextRange,
           let newText = textField.text(in: selectedRange),
           newText.count > 0 {
            return
        }
    }
UITextField输入框过滤表情
// 判断是否含有表情符号 yes-有 no-没有
+ (BOOL)stringContainsEmoji:(NSString *)string {
    __block BOOL returnValue =NO;
    [string enumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
        const unichar hs = [substring characterAtIndex:0];
        if (0xd800) {
            if (0xd800 <= hs && hs <= 0xdbff) {
                if (substring.length > 1) {
                    const unichar ls = [substring characterAtIndex:1];
                    const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
                    if (0x1d000 <= uc && uc <= 0x1f77f) {
                        returnValue =YES;
                    }
                }
            }else if (0x2100 <= hs && hs <= 0x27ff){
                returnValue =YES;
            }else if (0x2B05 <= hs && hs <= 0x2b07) {
                returnValue =YES;
            }else if (0x2934 <= hs && hs <= 0x2935) {
                returnValue =YES;
            }else if (0x3297 <= hs && hs <= 0x3299) {
                returnValue =YES;
            }else{
                if (substring.length > 1) {
                    const unichar ls = [substring characterAtIndex:1];
                    if (ls == 0x20e3) {
                        returnValue =YES;
                    }
                }
            }
            if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50 || hs == 0xd83e) {
                returnValue =YES;
            }
            
        }
    }];
    return returnValue;
}

// 判断第三方键盘中的表情
+ (BOOL)hasEmoji:(NSString*)string {
    NSString *pattern = @"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    BOOL isMatch = [pred evaluateWithObject:string];
    return isMatch;
}

// 去除表情
+ (NSString *)disableEmoji:(NSString *)text {
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]"options:NSRegularExpressionCaseInsensitive error:nil];
    NSString *modifiedString = [regex stringByReplacingMatchesInString:text options:0 range:NSMakeRange(0, [text length]) withTemplate:@""];
    return modifiedString;
}

private func setupRAC() {
        
        Observable.of(renameTextView.rx.text).merge().subscribe(onNext: { [weak self] in
            guard let `self` = self else { return }
            
            if var string = $0 {
                
                if NSString.stringContainsEmoji(string) || NSString.hasEmoji(string) {
                    string.removeLast()
                    self.renameTextView.text = string
                    MBProgressHUD.showInfoMessage("请勿输入表情")
                    return;
                }
                
                if string.count > 20 {
                    //通过字符串截取实现限制20字符长度
                    string.removeLast()
                    self.renameTextView.text = (string as NSString).substring(to: 20)
                }
                self.renameCountLabel.text = "\(string.count)/20"
            }
            
        }).disposed(by: rx.disposeBag)
        
    }
UITextField

相关文章

网友评论

      本文标题:UITextField输入框过滤表情

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