iOS 이모티콘 입력 제한(emoji)

5722 단어
데이터 전송 네트워크 요청을 제출할 때 사용자가 이모티콘을 입력했기 때문에 서버가 시스템 이상으로 되돌아와 체험감이 좋지 않습니다.서버가 emoji 인코딩을 검증하지 못하는 문제를 해결하기 위해서는 로컬에서 emoji의 입력 제어를 해야 한다. (일반적으로 서버가 데이터베이스에 emoji에 대응하는 디코딩 테이블을 추가하여 클라이언트가 emoji 표정을 보내는 것을 지원해야 한다.)
그래서 이런 수요가 생겼다. TextField나 TextView에서 모든 이모티콘을 입력하는 것을 제한한다(시스템이 가지고 있는 이모티콘, 제3자 키보드의 이모티콘, 그리고 일부 한자 유형의 이모티콘 포함).
다음 방법을 이용하여stringContainsemoji는 시스템 키보드의 표정을 제한할 수 있습니다
/**
*   emoji
* @param string  
* @return YES( )
*/
- (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];
        // surrogate pair
        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 {
            // non surrogate
            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;
}

아래의 이 방법을 이용하여 has Emoji는 제3자 키보드의 표정을 제한할 수 있다
/**
*   emoji
* @param string  
* @return YES( )
*/
- (BOOL)hasEmoji:(NSString*)string;
{
   NSString *pattern = @"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r
]"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern]; BOOL isMatch = [pred evaluateWithObject:string]; return isMatch; }

아래의 이 방법을 이용하여 has Emoji는 제3자 키보드의 표정을 제한할 수 있다
/**
*   emoji
* @param string  
* @return YES( )
*/
- (BOOL)hasEmoji:(NSString*)string;
{
   NSString *pattern = @"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r
]"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern]; BOOL isMatch = [pred evaluateWithObject:string]; return isMatch; }

아래의 이 방법을 이용하여 is Nine KeyBoard는 현재 9궁격 입력을 사용하고 있는지 판단할 수 있습니다
/**
 
@param string   
@return YES( )
*/
-(BOOL)isNineKeyBoard:(NSString *)string
{
   NSString *other = @"➋➌➍➎➏➐➑➒";
   int len = (int)string.length;
   for(int i=0;i

다음은 현재 UITextView에서 표정 입력을 금지하는 중요한 코드입니다. 에이전트를 준수하세요~
#pragma mark -------UITextViewDelegate
-(BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
   if ([textView isFirstResponder]) {
       
       if ([[[textView textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textView textInputMode] primaryLanguage]) {
           return NO;
       }

       // 
       if ([self isNineKeyBoard:text] ){
               return YES;
       }else{
           if ([self hasEmoji:text] || [GeneralMethods stringContainsEmoji:text]){
               return NO;
           }
       }
   }
   return YES;
}

UIText Field는 이 방법에 적어주시면 됩니다.
#pragma mark -----UITextFieldDelegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

}

몇 가지 유용한 방법을 첨부합니다.
//----- emoji
- (NSString *)disable_emoji:(NSString *)text {
   NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r
]"options:NSRegularExpressionCaseInsensitive error:nil]; NSString *modifiedString = [regex stringByReplacingMatchesInString:text options:0 range:NSMakeRange(0, [text length]) withTemplate:@""]; return modifiedString; }
/**
*    、 、 
*/
- (BOOL)isInputRuleAndNumber:(NSString *)str
{
   NSString *other = @"➋➌➍➎➏➐➑➒";     // 
   unsigned long len=str.length;
   for(int i=0;i= 0x4e00 && a <= 0x9fa6))
            ||([other rangeOfString:str].location != NSNotFound)
            ))
           return NO;
   }
   return YES;
}

주의: 위와 같은 방법은 키보드의 이모티콘 입력을 제한할 수 있지만, 이모티콘을 입력해야 하고, 다음 서버에서 이 이모티콘을 되돌려주고, 페이지에 다시 표시하려면 아래의 이 글을 보십시오.

좋은 웹페이지 즐겨찾기