zoukankan      html  css  js  c++  java
  • 新浪微博客户端(47)-在TextView中插入表情

    DJEmotionPageView.m

    // 发送点击广播(和android类似,区别在于android的广播是只要有上下文对象context,就可以发送)
        // iOS中的通知发送和接收都是通过NSNotificationCenter完成
        NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
        userInfo[DJEmotionDidSelctedEmotionKey] = btn.emotion;
        
        [[NSNotificationCenter defaultCenter] postNotificationName:DJEmotionDidSelectedNotification object:nil userInfo:userInfo];

    DJComposeViewControll.m

    - (void)registerNotificationReceiver {
    
        
        // 注册监听表情按钮点击通知
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onReceiveEmotionBtnClick:) name:DJEmotionDidSelectedNotification object:nil];
        
        
    }
    
    
    /** 接收到表情按钮点击通知 */
    - (void)onReceiveEmotionBtnClick:(NSNotification *)notification {
    
        NSDictionary *intent =  notification.userInfo;
        DJEmotion *emotion = intent[DJEmotionDidSelctedEmotionKey];
        [self.textView insertEmotion:emotion];
        
    }

    DJEmotionTextView.m

    - (void)insertEmotion:(DJEmotion *)emotion {
    
    
        // 插入表情
        if (emotion.code) { // Emoji表情
            [self insertText:[NSString emojiWithStringCode:emotion.code]];
        } else if (emotion.png) { // 表情图片
            NSString *emotionName = emotion.png;
            NSString *imagePath;
            if ([emotionName hasPrefix:@"d_"] || [emotionName hasPrefix:@"f_"] ||
                [emotionName hasPrefix:@"h_"] || [emotionName hasPrefix:@"l_"] || [emotionName hasPrefix:@"o_"] || [emotionName hasPrefix:@"w_"]) {
                imagePath = [NSString stringWithFormat:@"EmotionIcons/default/%@",emotion.png]; // 默认表情路径
            } else if ([emotionName hasPrefix:@"lxh_"]) {
                imagePath = [NSString stringWithFormat:@"EmotionIcons/lxh/%@",emotion.png]; // 浪小花表情路径
            }
            
            // 以textView的原本内容为基础构造一个attrStr
            NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedText];
            
            // 构造表情附件
            NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
            attachment.image = [UIImage imageNamed:imagePath];
            CGFloat attachmentWH = self.font.lineHeight;
            attachment.bounds = CGRectMake(0, -4, attachmentWH, attachmentWH);
            
            // 连接表情图片
            NSAttributedString *attachStr = [NSAttributedString attributedStringWithAttachment:attachment];
            
            // 将附件文本插入到光标所在的位置
            NSUInteger cursorLocation = self.selectedRange.location;
            [attrStr insertAttributedString:attachStr atIndex:cursorLocation];
            
            // 设置当前attrStr的字体,因为attrStr的字体无法通过textview.font属性来设置
            [attrStr addAttribute:NSFontAttributeName value:self.font range:NSMakeRange(0, attrStr.length)];
            
            // 更新当前textView内容
            self.attributedText = attrStr;
            
            // 修正当前光标位置(将光标移动到插入表情末尾,默认光标会跳转到所有文本最后)
            self.selectedRange = NSMakeRange(cursorLocation + 1, 0);
            
        }
        
    
    }

    最终效果:

      

  • 相关阅读:
    暗时间:学习的精神和方法
    林布蘭
    魯本斯
    維梅爾
    哈爾斯.法蘭斯
    SAFEARRAY使用方法示例
    范戴克
    100个经典错别字
    在CPP中调用Jscript中的函数
    生活在真空中的程序员
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/6123548.html
Copyright © 2011-2022 走看看