NSTextAttachment实现图文混排

2023-11-01

苹果在iOS7中推出了一个新的类NSTextAttachment,它是做图文混排的利器,本文就是用这个类,只用50行代码实现文字与表情混排,当然也可以实现段落中的图文混排。
首先说一下文字和表情的混排:
先来做点儿准备工作,搞一个存放表情信息的plist文件
这里写图片描述

 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Image" ofType:@"plist"];
    NSArray *face = [NSArray arrayWithContentsOfFile:filePath];

    NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:text];
    NSString *regex_emoji =@"\\[[a-zA-Z0-9\\/\\u4e00-\\u9fa5]+\\]";//匹配表情

    NSError *error =nil;

    NSRegularExpression *re = [NSRegularExpression regularExpressionWithPattern:regex_emoji options:NSRegularExpressionCaseInsensitive error:&error];

    if(!re) {

        NSLog(@"%@", [error localizedDescription]);
        return attributeString;

    }

    NSArray *resultArray = [re matchesInString:text options:0 range:NSMakeRange(0, text.length)];

    NSMutableArray *imageArray = [NSMutableArray arrayWithCapacity:resultArray.count];

    //根据匹配范围来用图片进行相应的替换

    for(NSTextCheckingResult *match in resultArray) {

        //获取数组元素中得到range

        NSRange range = [match range];

        //获取原字符串中对应的值

        NSString *subStr = [text substringWithRange:range];

        for(int i =0; i < face.count; i ++) {

            if([face[i][@"cht"] isEqualToString:subStr]) {

                //face[i][@"png"]就是我们要加载的图片

                //新建文字附件来存放我们的图片,iOS7才新加的对象

                NSTextAttachment *textAttachment = [[NSTextAttachment alloc]init];

                //给附件添加图片

                textAttachment.image= [UIImage imageNamed:face[i][@"png"]];

                //调整一下图片的位置,如果你的图片偏上或者偏下,调整一下bounds的y值即可

                textAttachment.bounds=CGRectMake(0, -8, textAttachment.image.size.width, textAttachment.image.size.height);

                //把附件转换成可变字符串,用于替换掉源字符串中的表情文字

                NSAttributedString *imageStr = [NSAttributedString attributedStringWithAttachment:textAttachment];

                //把图片和图片对应的位置存入字典中

                NSMutableDictionary *imageDic = [NSMutableDictionary dictionaryWithCapacity:2];

                [imageDic setObject:imageStr forKey:@"image"];

                [imageDic setObject:[NSValue valueWithRange:range]forKey:@"range"];

                //把字典存入数组中

                [imageArray addObject:imageDic];

            }

        }

    }

    //4、从后往前替换,否则会引起位置问题

    for(int i = (int)imageArray.count-1; i >=0; i--) {

        NSRange range;

        [imageArray[i][@"range"] getValue:&range];

        //进行替换
        [attributeString replaceCharactersInRange:range withAttributedString:imageArray[i][@"image"]];
    }

以上代码段是写了一个工具类以实现图文混排,也可以为NSString写一个分类来实现。下面说一下用法:

NSString *content =@"文字加上表情[得意][][呲牙]";

NSMutableAttributedString *attrStr = [Utility emotionStrWithString:content];

_contentLabel.attributedText= attrStr;

有了上面的方法,要实现图片和文字的排布就更容易了,只需要将某些图片给它设置一个固定的字符对应即可。
具体方法如下:
NSString *praiseStr =@”路人甲、路人乙”;

NSString *praiseInfo = [NSString stringWithFormat:@”<点赞> %@”,praiseStr];

NSDictionary *attributesForAll =@{NSFontAttributeName:[UIFont systemFontOfSize:14.0],NSForegroundColorAttributeName:[UIColorgrayColor]};

NSMutableAttributedString*attrStr = [Utility exchangeString:@”<点赞>”withText:praiseInfoimageName:@”dynamic_love_blue”];

有什么不足或者bug欢迎及时沟通!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSTextAttachment实现图文混排 的相关文章

  • php 随机生成指定金额范围内的随机数

    function random bag money total personal num min money money total 20 personal num 19 min money 1 money right money tota
  • 《STL源码剖析》学习笔记2——神奇的__type_traits

    标签 C C STL 学习 笔记 在STL中为了提供通用的操作而又不损失效率 我们用到了一种特殊的技巧 叫traits编程技巧 具体的来说 traits就是通过定义一些结构体或类 并利用模板类特化和偏特化的能力 给类型赋予一些特性 这些特性
  • Hadoop的伪分布式运行模式

    Hadoop运行模式包括 本地模式 伪分布式模式 以及完全分布式模式 1 本地模式 安装简单 在一台机器上运行服务 几乎不用做任何配置 但仅限于调试用途 没有分布式文件系统 直接读写本地操作系统的文件系统 2 伪分布式模式 在单节点上同时启
  • 浅析GPT2中的autoregressive和BERT的autoencoding源码实现

    经常使用BERT来做研究 因此对Encoder的架构较为熟悉 但是从来没有了解过GPT这样的Decoder架构 尤其对自回归的形式不知道源码是如何实现的 为了方便对比和讨论 接来下所探讨的源码都是基于HuggingFace这个框架的 Ber
  • 损失函数(IoU、GIoU、DIoU、CIoU)

    一 IoU 1 笔记原页 IoU Loss 1 IoU 2 IOU优缺点 目标检测中常常用iou来衡量proposal或anchor和gt之间的重合度 也就是他们之间的交并比 是目标检测中重要的评价尺度 鲜明的特点就是对尺度scale不敏感
  • 指针作函数返回值

    include
  • OCaml学习笔记(二)——Introduction to Objective Camel

    Chapter2 Simple Expressions 2 1 注释语句 OCaml语言中注释部分写在 和 之间 可以相互嵌套 注释部分当作空格处理 2 2 基本表达式 OCaml中每个有效的表达式都有一个类型 某个类型的表达式不能用作其他
  • iOS开发之内存管理

    iOS开发之内存管理 一 垃圾回收机制 二 内存管理的概念 三 OC内存管理注意事项 四 MRC相关语法 一 垃圾回收机制 与Java语言相同Objective c 2 0之后 也提供了垃圾回收机制 OC是支持垃圾回收机制的 Garbage
  • 学习笔记-前端开发架构设计

    前端开发的技术选项主要包含以下几点 下面对一些名词概念的解释做了笔记 1 分层架构 把功能相似 抽象级别相近的实现进行分层隔离 优势 松散耦合 易维护 易复用 易扩展 常见分层方式 MVC MVVM 2 模块化 解决一个复杂问题时 自顶向下
  • 大神之路-起始篇

    欢迎关注 WeiyiGeek 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 全栈实践 再到 放弃学习 涉及 网络安全运维 应用开发 物联网IOT 学习路径 个人感悟 等知识 花开堪折直须折 莫待无花空折枝 本章目
  • Linux 搭建 JumpServer 堡垒机

    跳板机概述 跳板机就是一台服务器 开发或运维人员在维护过程中首先要统一登录到这台服务器 然后再登录到目标设备进行维护和操作 跳板机缺点 没有实现对运维人员操作行为的控制和审计 使用跳板机的过程中还是会出现误操作 违规操作导致的事故 一旦出现
  • Python入门教程完整版,Python所有方向学习体系,学完即可就业

    今天给大家带来了干货 Python入门教程完整版 完整版啊 完整版 言归正传 小编该给大家介绍一下这套教程了 希望每个小伙伴都沉迷学习 无法自拔 本套教程学习时间15天 1 3天内容 为Linux基础命令 4 13天内容 为Python基础
  • Object.setPrototypeOf()

    Object setPrototypeOf 子对象 父对象 运行结束后 子对象 proto 指向 父对象 setPrototypeOf就是更换对象的 原型对象
  • 编译器报:lambda表达式中使用的变量应为final或有效final 解决方案

    目录 问题描述 原因分析 解决方案 1 声明为final 2 使用有效final 4 使用数组或集合 错误问题的最终解决示例 总结 问题描述 今天在写代码的过程中想要在stream map 方法内部对外部变量进行赋值 结果发现编译器报错 提
  • 如何获取iPhone手机的UUID

    方法一 通过Windows下的iTunes 1 数据线连接iPhone手机 在Windows下打开iTunes 在 iPhone 管理界面下zhi点击 序列号 查看自己的 UUID 标识符 2 此dao时点击菜单 编辑 gt 复制 3 新建
  • QT调试详细操作步骤及案例分析

    目录 QT调试详细操作步骤及案例分析 QT调试详细步骤 1 手动调试 1 1 输入备调试的代码 1 2 设置断点 1 3 单步调试简单介绍 1 4 调试案例 1 4 1 纯C 代码的调试 1 4 2 QT程序的调试 2 使用QDebug进行
  • Matlab导出动态链接库dll

    1 新建 m文件 内容 function c Add a b c a b end 保存为 Add m 2 命令行输入 gt gt mex setup MEX configured to use Microsoft Visual C 2013
  • 配置描述文件mobileconfig的生成及注意事项

    1 mobileconfig描述配置文件的下载 我们要控制ios上的移动设备 那么我们就需要下载mobileconfig描述配置文件 一般我们可以一个设备对应一个设备ID 即我们后面会看到的请求参数 deviceId 例如 PUT Path
  • 不在傻傻for循环!完美解决JPA批量插入问题

    前言 jpa在简单的增删改查方面确实帮助我们节省了大部分时间 但是面对复杂的情况就显得心有余而力不足了 最近遇到一个批量插入的情况 jpa虽然提供了saveAll方法 但是底层还是for循环save 如果遇到大量数据插入频繁与数据库交互必然
  • C 库函数 - gmtime()

    描述 C 库函数 struct tm gmtime const time t timer 使用 timer 的值来填充 tm 结构 并用协调世界时 UTC 也被称为格林尼治标准时间 GMT 表示 声明 下面是 gmtime 函数的声明 st

随机推荐