• 新浪微博客户端(50)-解决输入Emotion表情逐渐变小的问题


    UITextView+Extension.h

    #import <UIKit/UIKit.h>
    
    @interface UITextView (Extension)
    
    /** 插入属性文本 */
    - (NSMutableAttributedString *)insertAttributeText:(NSAttributedString *)insertAttrText;
    
    /** 插入属性文本和要设置的block内容 */
    - (NSMutableAttributedString *)insertAttributeText:(NSAttributedString *)insertAttrText settingsBlock:(void (^)(NSMutableAttributedString * attributedString)) settingsBlock;
    
    
    @end

    UITextView+Extension.m

    #import "UITextView+Extension.h"
    
    @implementation UITextView (Extension)
    
    
    - (NSMutableAttributedString *)insertAttributeText:(NSAttributedString *)insertAttrText {
    
        return [self insertAttributeText:insertAttrText settingsBlock:nil];
        
    }
    
    
    - (NSMutableAttributedString *)insertAttributeText:(NSAttributedString *)insertAttrText settingsBlock:(void (^)(NSMutableAttributedString *))settingsBlock {
    
        
        // 以textView的原本内容为基础构造一个attrStr
        NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedText];
        
        // 将附件文本插入到光标所在的位置
        NSUInteger cursorLocation = self.selectedRange.location;
        [attrStr insertAttributedString:insertAttrText atIndex:cursorLocation];
    
        
        // 如果传入了block,就调用block
        if(settingsBlock) {
            settingsBlock(attrStr);
        }
        
        // 更新当前textView内容
        self.attributedText = attrStr;
        
        // 修正当前光标位置(将光标移动到插入表情末尾,默认光标会跳转到所有文本最后)
        self.selectedRange = NSMakeRange(cursorLocation + 1, 0);
        
        return attrStr;
    
    }
    
    
    @end

    DJEmotionTextView.m

    #import "DJEmotionTextView.h"
    #import "DJEmotion.h"
    
    @implementation DJEmotionTextView
    
    
    
    - (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]; // 浪小花表情路径
            }
            
            
            // 构造表情附件
            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];
            
            // 插入属性文本
            [self insertAttributeText:attachStr settingsBlock:^(NSMutableAttributedString *attributedString) {
                
                // 设置当前attrStr的字体与textView原有字体大小一致,因为attrStr的字体无法通过textview.font属性来设置
                [attributedString addAttribute:NSFontAttributeName value:self.font range:NSMakeRange(0, attributedString.length)];
    
            }];
        }
    
    }
    
    
    @end
  • 相关阅读:
    hadoop2 作业执行过程之作业提交
    Hadoop各个服务端口列表
    基于 Nginx 和 FFmpeg 搭建流媒体服务器
    prometheus
    ubuntu 下dbus的环境搭建和使用
    Hadoop-Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster —
    Exception message: /bin/bash: line 0: fg: no job control
    P3942 将军令 [贪心]
    P3941 入阵曲
    P3941 入阵曲
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/6130679.html
Copyright © 2020-2023  润新知