Search code examples
iosobjective-cnsattributedstringemoji

How to detect emoji and change font size


I have text which contains emoji in it, we are able to display it correctly by doing encoding and decoding the string, what I need to achieve is to increase the font size of only emoji in the text like in image below,

enter image description here

I have got an idea to determine the range of all emoji, and supply in NSAttributedString with increased font size. Now am out of idea how can I detect range of emojis in a given string?

Thanks


Solution

  • Thanks to all who answered, but none was complete answer though @Raj's suggestion to look NSString-RemoveEmoji helped me to achieve the solution for this, here it is, it works for any kind of emoji

    -(NSMutableAttributedString *)getAttributedEmojiString:(NSString *)inputString{
    
        NSMutableArray *__block emojiRange=[[NSMutableArray alloc] init];
        [inputString enumerateSubstringsInRange:NSMakeRange(0, [inputString length])
                                        options:NSStringEnumerationByComposedCharacterSequences
                                     usingBlock: ^(NSString* substring, NSRange substringRange, NSRange enclosingRange, BOOL* stop) {
                 if([substring isEmoji]){
                     [emojiRange addObject:@{@"startrange":@(substringRange.location),@"endrange":@(enclosingRange.length)}];
                 }
         }];
    
        NSMutableAttributedString *mutString=[[NSMutableAttributedString alloc] initWithString:inputString];
    
    
        [mutString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:16.0] range:NSMakeRange(0, mutString.length)];
    
        [emojiRange enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            [mutString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:35.0] range:NSMakeRange([obj[@"startrange"] floatValue], [obj[@"endrange"] floatValue])];
        }];
    
        return mutString;
    }
    

    Description

    1. First find NSRange of all the emoji in the string by using NSString-RemoveEmoji function isEmoji, and store in array.
    2. Supply the fetched range to apply bigger FONT SIZE to characters in the range.
    3. Finally assign the generated attributed text to the label.

      self.label.attributedText=[self getAttributedEmojiString:EmojiDecoded(originalText)];
      

    I use two macros to Encode and Decode Emoji's since I need to save these values to server and read through api, below are the macros.

    #define Encoded(val) [[val dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0]
    #define Decoded(val) [[NSString alloc] initWithData:[[NSData alloc] initWithBase64EncodedString:val options:0] encoding:NSUTF8StringEncoding]
    
    #define EmojiEncoded(val) [[NSString alloc] initWithData:[val dataUsingEncoding:NSNonLossyASCIIStringEncoding] encoding:NSUTF8StringEncoding]
    #define EmojiDecoded(val) [[NSString alloc] initWithData:[val dataUsingEncoding:NSUTF8StringEncoding] encoding:NSNonLossyASCIIStringEncoding]
    

    Hope it helps anyone who is looking for similar solution.

    Cheers, and thanks to all.