iOStextField/textView在輸入時(shí)限制emoji表情的輸入

又遇到輸入框輸入表情的情況了获询,之前寫了一篇文章“UITextView/UITextField檢測并過濾Emoji表情符號(hào)”http://www.reibang.com/p/90d68e7e5d53,但是總覺得那兩種方式都各有弊端带猴,這次又遇到之后泻云,仔細(xì)考慮了下之后,想到了用兩種方式組合在一起使用香伴,測試結(jié)果暫時(shí)沒什么問題,在輸入時(shí)就限制了emoji表情輸入,完全符合需求。在此貼出代碼麻裳,如果有什么問題口蝠,歡迎指正器钟!

@interface JQTestViewController ()<UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *textField;
@property (nonatomic, assign) NSInteger textLocation;//這里聲明一個(gè)全局屬性,用來記錄輸入位置
@end

- (void)viewDidLoad {
[super viewDidLoad];
self.textField.delegate = self;
[self.textField addTarget:self action:@selector(textFieldDidChanged:) forControlEvents:UIControlEventEditingChanged];//注意:textFied沒有textFieldDidChanged代理方法妙蔗,但是有UITextFieldTextDidChangeNotification通知傲霸,這里添加通知方法,textView有textFieldDidChanged代理方法眉反,下面用法一樣
}

#pragma mark-- UITextFieldDelegate
//在輸入時(shí)昙啄,調(diào)用下面那個(gè)方法來判斷輸入的字符串是否含有表情
- (void)textFieldDidChanged:(UITextField *)textField
{
    if (textField.text.length > 20) {
        textField.text = [textField.text substringToIndex:20];
        [self showMessage:@"不可超過20字!"];
    }else {
        if (self.textLocation == -1) {
            NSLog(@"輸入不含emoji表情");
        }else {
            NSLog(@"輸入含emoji表情");
            //截取emoji表情前
            textField.text = [textField.text substringToIndex:self.textLocation];
        }
    }
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSLog(@"location-->>%lu",(unsigned long)range.location);
    NSLog(@"replacementString-->>%@",string);
    //禁止輸入emoji表情
    if ([self stringContainsEmoji:string]) {
        self.textLocation = range.location;
    }else {
        self.textLocation = -1;
    }
    return YES;
}

//表情符號(hào)的判斷
- (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 <= 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 (substring.length > 1) {
                                    const unichar ls = [substring characterAtIndex:1];
                                    if (ls == 0x20e3) {
                                        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 (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) {
                                        returnValue = YES;
                                    }
                                }
                            }];
    
    return returnValue;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寸五,一起剝皮案震驚了整個(gè)濱河市梳凛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梳杏,老刑警劉巖韧拒,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異十性,居然都是意外死亡叛溢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門劲适,熙熙樓的掌柜王于貴愁眉苦臉地迎上來楷掉,“玉大人,你說我怎么就攤上這事霞势∨胫玻” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵愕贡,是天一觀的道長刊橘。 經(jīng)常有香客問我,道長颂鸿,這世上最難降的妖魔是什么促绵? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上败晴,老公的妹妹穿的比我還像新娘浓冒。我一直安慰自己,他們只是感情好尖坤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布稳懒。 她就那樣靜靜地躺著,像睡著了一般慢味。 火紅的嫁衣襯著肌膚如雪场梆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天纯路,我揣著相機(jī)與錄音或油,去河邊找鬼。 笑死驰唬,一個(gè)胖子當(dāng)著我的面吹牛顶岸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叫编,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼辖佣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搓逾?” 一聲冷哼從身側(cè)響起卷谈,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎霞篡,沒想到半個(gè)月后世蔗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寇损,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年凸郑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矛市。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芙沥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浊吏,到底是詐尸還是另有隱情而昨,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布找田,位于F島的核電站歌憨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏墩衙。R本人自食惡果不足惜务嫡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一甲抖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧心铃,春花似錦准谚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至愉棱,卻和暖如春唆铐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奔滑。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工艾岂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人档押。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓澳盐,卻偏偏與公主長得像祈纯,于是被迫代替她去往敵國和親令宿。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容