iOS- 富文本

如何在Markdown中并排排列多张图片 在Markdown中并排排列多张图片是一种常见的需求,尤其是在需要展示对比图像或者创建图像画廊时。Markdown本身不支持复杂的布局,但我们可以通过HTML来实现这一功能。 阅读详情

在iOS开发中经常会遇到一些图文混排的情况,特别是在微博类应用的开发过程中经常会遇到各种表情,各种链接的解析。笔者在实践开发中经历了几次这种类型的开发,由最开始的利用WebView进行布局到最后利用富文本进行布局,对该部分的开发积累了一定的经验,现对富文本与正则表达式混用实现图文混排进行总结:

一.富文本

     WebView虽然也可以实现图文混排的效果,但是在使用的时候比较复杂,而且WebVIew的内存泄漏相当明显,使用不好反而得补偿失。现在很多的新闻类App都采用自己写的富文本进行图文混排。在很多情况下,富文本表现予外的是一个Label,将要显示的内容通过正则等封装成HTML字符串,然后显示在界面上,

下面就是按照步骤实现这一功能:

(1)先下载已经封装好的富文本标签类RCLabel(http://www.okbase.net/file/item/20694)

    该类是由一牛人封装好的用于实现图文混排的富文本类,在下载下来的源代码中可以看到其用法,但是这里有一个较为复杂的问题是你每次都需要手动将你要显示的内容封装成HTML格式的文本,这个过程相当繁琐而且容易出错,所以我在这个基础上进行了改进,将封装HTML的方法通过正则表达式独立开来,这样就实现了RCLabel与正则实现图文混排,以下是代码:

     将字符串转化成HTML的正则如下:


     .h头文件

     

[html]  view plain copy
  1.  #import <Foundation/Foundation.h>  
  2.   
  3.   
  4. @interface HtmlString : NSString  
  5.   
  6.   
  7. + (NSString *)transformString:(NSString *)originalStr;  
  8.   
  9.   
  10. @end  

     .m文件

[html]  view plain copy
  1.  #import "HtmlString.h"  
  2.   
  3. #import <Foundation/NSObjCRuntime.h>  
  4.   
  5. #import "RegexKitLite.h"  
  6.   
  7.   
  8. @implementation HtmlString  
  9.   
  10.   
  11. + (NSString *)transformString:(NSString *)originalStr  
  12.   
  13. {  
  14.   
  15.     NSString *text = originalStr;  
  16.   
  17.       
  18.   
  19.     //解析http://短链接  
  20.   
  21.     NSString *regex_http =@"http(s)?://([a-zA-Z|\\d]+\\.)+[a-zA-Z|\\d]+(/[a-zA-Z|\\d|\\-|\\+|_./?%&=]*)?";//http://短链接正则表达式  
  22.   
  23.     NSArray *array_http = [text componentsMatchedByRegex:regex_http];  
  24.   
  25.       
  26.   
  27.     if ([array_http count]) {  
  28.   
  29.         for (NSString *strin array_http) {  
  30.   
  31.             NSRange range = [text rangeOfString:str];  
  32.   
  33.             NSString *funUrlStr = [NSStringstringWithFormat:@"<a href=%@>%@</a>",str, str];  
  34.   
  35.             text = [text stringByReplacingCharactersInRange:NSMakeRange(range.location, str.length)withString:funUrlStr];  
  36.   
  37.         }  
  38.   
  39.     }  
  40.   
  41.   
  42.     //解析@  
  43.   
  44.     NSString *regex_at =@"@[\\u4e00-\\u9fa5\\w\\-]+";//@的正则表达式  
  45.   
  46.     NSArray *array_at = [text componentsMatchedByRegex:regex_at];  
  47.   
  48.     if ([array_at count]) {  
  49.   
  50.         NSMutableArray *test_arr = [[NSMutableArrayalloc]init];  
  51.   
  52.         for (NSString *strin array_at) {  
  53.   
  54.             NSRange range = [text rangeOfString:str];  
  55.   
  56.             if (![test_arr containsObject:str]) {  
  57.   
  58.                 [test_arr addObject:str];  
  59.   
  60.                 NSString *funUrlStr = [NSStringstringWithFormat:@"<a href=%@>%@</a>",str, str];  
  61.   
  62.                 text = [text stringByReplacingCharactersInRange:NSMakeRange(range.location, [str length]) withString:funUrlStr];  
  63.   
  64.             }  
  65.   
  66.         }  
  67.   
  68.         [test_arr release];  
  69.   
  70.     }  
  71.   
  72.       
  73.   
  74.       
  75.   
  76.     //解析&  
  77.   
  78.     NSString *regex_dot =@"\\$\\*?[\u4e00-\u9fa5|a-zA-Z|\\d]{2,8}(\\((SH|SZ)?\\d+\\))?";//&的正则表达式  
  79.   
  80.     NSArray *array_dot = [text componentsMatchedByRegex:regex_dot];  
  81.   
  82.     if ([array_dot count]) {  
  83.   
  84.         NSMutableArray *test_arr = [[NSMutableArrayalloc]init];  
  85.   
  86.         for (NSString *strin array_dot) {  
  87.   
  88.             NSRange range = [text rangeOfString:str];  
  89.   
  90.             if (![test_arr containsObject:str]) {  
  91.   
  92.                 [test_arr addObject:str];  
  93.   
  94.                 NSString *funUrlStr = [NSStringstringWithFormat:@"<a href=%@>%@</a>",str, str];  
  95.   
  96.                 text = [text stringByReplacingCharactersInRange:NSMakeRange(range.location, [str length]) withString:funUrlStr];  
  97.   
  98.             }  
  99.   
  100.         }  
  101.   
  102.         [test_arr release];  
  103.   
  104.     }  
  105.   
  106.   
  107.     //解析话题  
  108.   
  109.     NSString *regex_pound = @"#([^\\#|.]+)#";//话题的正则表达式  
  110.   
  111.     NSArray *array_pound = [text componentsMatchedByRegex:regex_pound];  
  112.   
  113.       
  114.   
  115.     if ([array_pound count]) {  
  116.   
  117.         for (NSString *strin array_pound) {  
  118.   
  119.             NSRange range = [text rangeOfString:str];  
  120.   
  121.             NSString *funUrlStr = [NSStringstringWithFormat:@"<a href=%@>%@</a>",str, str];  
  122.   
  123.             text = [text stringByReplacingCharactersInRange:NSMakeRange(range.location, [strlength])withString:funUrlStr];  
  124.   
  125.         }  
  126.   
  127.     }  
  128.   
  129.   
  130.     //解析表情  
  131.   
  132.     NSString *regex_emoji =@"\
    [a−zA−Z0−9u4e00−u9fa5]+
    ";//表情的正则表达式  
  133.   
  134.     NSArray *array_emoji = [text componentsMatchedByRegex:regex_emoji];  
  135.   
  136.     NSString *filePath = [[[NSBundlemainBundle]resourcePath]stringByAppendingPathComponent:@"emotionImage.plist"];  
  137.   
  138.     NSDictionary *m_EmojiDic = [[NSDictionaryalloc]initWithContentsOfFile:filePath];  
  139.   
  140.    // NSString *path = [NSString stringWithFormat:@"%@", [[NSBundle mainBundle] bundlePath]];  
  141.   
  142.       
  143.   
  144.     if ([array_emoji count]) {  
  145.   
  146.         for (NSString *strin array_emoji) {  
  147.   
  148.             NSRange range = [text rangeOfString:str];  
  149.   
  150.             NSString *i_transCharacter = [m_EmojiDicobjectForKey:str];  
  151.   
  152.             if (i_transCharacter) {  
  153.   
  154.                 //NSString *imageHtml = [NSString stringWithFormat:@"<img src = 'file://%@/%@' width='12' height='12'>", path, i_transCharacter];  
  155.   
  156.                 NSString *imageHtml = [NSStringstringWithFormat:@"<img src =%@>",  i_transCharacter];  
  157.   
  158.                 text = [text stringByReplacingCharactersInRange:NSMakeRange(range.location, [str length]) withString:[imageHtmlstringByAppendingString:@" "]];  
  159.   
  160.             }  
  161.   
  162.         }  
  163.   
  164.     }  
  165.   
  166.     [m_EmojiDic release];  
  167.   
  168.     //返回转义后的字符串  
  169.   
  170.     return text;  
  171.   
  172. }  
  173.   
  174.   
  175. @end  

    实用的时候:

[html]  view plain copy
  1.    //contentStr为你要显示的图文字符串  
  2.   
  3.    NSString *str = [HtmlStringtransformString:contentStr];  
  4.   
  5.     textLabel = [[RCLabelalloc]initWithFrame:CGRectMake(10,160,300,84)];  
  6.   
  7.     textLabel.delegate =self;  
  8.   
  9.     textLabel.sizeDelegate =self;  
  10.   
  11.     [textLabelsetFont:[UIFontfontWithName:TextNamesize:15]];  
  12.   
  13.     RCLabelComponentsStructure *componentsDS = [RCLabelextractTextStyle:textString];  
  14.   
  15.     textLabel.componentsAndPlainText = componentsDS;  
  16.   
  17.     CGSize optimalSize = [textLabeloptimumSize:YES];   //计算图文混排后的高度  
  18.   
  19.     textLabel.frame=CGRectMake(10,180,300, optimalSize.height+5);  
  20.   
  21.     textLabel.lineBreakMode =NSLineBreakByCharWrapping;  
  22.   
  23.     textLabel.backgroundColor = [UIColorclearColor];  
  24.   
  25.     textLabel.textColor = [UIColorcolorWithRed:33.0/255green:33.0/255blue:33.0/255alpha:1];  
  26.   
  27.     [self.viewaddSubview:textLabel];  
  28.   
  29.    //如果你在实现图文混排时还有超链接、@、$等,在最后实现该类的代理方法  
  30.   
  31. -(void)RCLabel:(id)RCLabel didSelectLinkWithURL:(NSString *)url  
  32.   
  33. {   //url为超链接的文字内容  
  34.   
  35.   
  36. }   

效果图:


demo 点击下载

原文出处:http://blog.youkuaiyun.com/javayujiafeng/article/details/14163319

iOS通过html模版实现富文本编辑 在iOS开发中,常常会遇到一些富文本编辑,如新闻,公告等,NSMutableAttributedString又有一定的局限性,所以我想到用html 模版去加载富文本页面,根据所需要的格式,去构建相应的html界面。一个简单的html模版如下: lang="en">     charset="UTF-8">     Title     rel="s 阅读详情

相关推荐

iOS开发 按钮富文本

今天想写个按钮的富文本,几经波折之后,完成了。 先上代码 一开始以为直接设置按钮的attributedTitle就可以了,但是执行效果却是如下图: 全部变色了,好吧,再加上一句self.serverBtn.titleLabel.attributedText = attributedStr; 这回就行了, 于是

chaochso的博客 5311

14、iOS里面的富文本

iOS里面的富文本巧用UITextView实现富文本的点击效果 巧用UITextView实现富文本的点击效果 class RegisterController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() //用UItextView 实现富文本的功能 let textView = UITextView(frame: CGRect(x:

重楼的博客 3501

iOS小技能:富文本&图文混排

文章目录引言I、封装富文本API,采用block实现链式编程II、超链接属性的应用案例III、HTML字符串与富文本互转 引言 I、封装富文本API,采用block实现链式编程 iOS开发效率工具:完整SDK源码【封装富文本API,采用block实现链式编程】(block 的妙用:结合block和方法的优点实现iOS的链式编程) 1、文章:https://blog.youkuaiyun.com/z929118967/article/details/107835195 2、从优快云资源下载完整SDK代码:https:

专注于计算机研发知识和资讯分享 2260

ios知识点总结——富文本实现图文混排

在iOS开发中经常会遇到一些图文混排的情况,特别是在微博类应用的开发过程中经常会遇到各种表情,各种链接的解析。笔者在实践开发中经历了几次这种类型的开发,由最开始的利用WebView进行布局到最后利用富文本进行布局,对该部分的开发积累了一定的经验,现对富文本与正则表达式混用实现图文混排进行总结: 一.富文本      WebView虽然也可以实现图文混排的效果,但是在使用的时候比较复杂,

西北风的专栏 2万+

RK3588 EVB开发板原理图讲解【六】

该原理图展示了eMMC Flash与主控芯片之间的连接关系,以及相关的电源、信号线路和去耦电容等。

weixin_48721556的博客 1176

从AXI到CHI:深入解析基于Credit的流量控制如何优化NoC设计

本文深入解析了从AXI握手式流控到CHI基于Credit的流量控制机制的演进。通过对比传统流控的瓶颈,详细阐述了Credit机制如何通过信用预分配和记账系统,有效解决FIFO气泡、时序收敛等难题,从而优化NoC设计的带宽利用率、降低延迟并提升系统可扩展性。

weixin_29227585的博客 522

iOS - 富文本AttributedString

AttributedString可以分为NSAttributedString和NSMutableAttributedString两种,在使用中通过把AttributedString赋值给控件的attributedText属性来添加文字样式。具有该属性的控件有UILabel、UITextField和UITextView。

chaneylauok的博客 1230

逆向解析手淘x-sign签名算法:从抓包到API调用的完整实践

本文详细解析了手淘x-sign签名算法的逆向过程,从抓包工具选择到API调用实践,提供了完整的解决方案。通过分析签名参数组成和生成机制,帮助开发者理解并实现淘宝接口的合法调用,同时强调了安全与合规的重要性。

weixin_29323273的博客 606

flutter 富文本编辑器 支持图文、视频混排。

pub地址 rich_edit flutter 富文本编辑器 支持图文、视频混排。 效果预览 Getting Started 首先需要继承实现RichEditController。 简单使用可直接用下面的例子。 chewie: 0.9.10 video_player: 0.10.11 image_picker: 0.6.7 import 'package:chewie/chewie.dart'; import 'package:flutter/material.dart'; import 'p

qq_37879809的博客 4013

面板数据分析中的随机前沿软件FRONTIER Version 4.1应用

随机前沿模型是一种用于评估单位效率的统计方法。它考虑了输入和输出的随机性,允许我们在效率评估中引入不确定性。随机前沿模型通常用于评估生产单位、金融机构、医院等各种类型的决策单元的效率。FRONTIER是一个广泛使用的随机前沿分析软件,具有用户友好的界面和强大的功能。它提供了估计效率、前沿分析和模型比较的工具,使用户能够深入研究单位的效率和绩效。面板数据是一种包含多个单位(通常是时间序列数据)的数据类型,可以用于分析单位在不同时间点的变化和效率。

目标检测专栏持续更新中,改进YOLO系列通用,适用v5、v7、v8、所有博客均是团队原创博客,所有文章禁止转载,违者必究。 2982

中标麒麟,postgres报错invalid value for parameter "timeZone":"Asia/Beijing"

在中标麒麟服务器上,安装postgres,启动tomcat容器时,报invalid value for parameter "timeZone":"Asia/Beijing"。 查看postgres运行日志,也报同样的错误。 报错原因:服务器的时区,在Postgres支持的时区目录中找不到。当时在服务器上信息为Beijing 解决步骤: 1. cat /etc/sysconfig/cloc

u010213931的博客 7924

iOS 富文本添加图片

一、概念 添加图片效果图 富文本添加图片代码 富文本总结 直接拷贝代码就可以用 二、添加图片效果图 三、富文本添加图片代码 // ViewController.m // 测试富文本 // // Created by joyshow on 2018/7/10. // Copyright © 2018年 石虎. All rights reserved. #import...

H.A.N的博客 2482

Python OpenCV基于颜色通道分离法去除图片中的红色印章

最近一段时间的工作都是研究如何去除图片中的红色印章,在网上查找了大量的大佬写过的方法,发现大多数是采取颜色通道分离法来做,并且效果还不错。站在前人的肩膀上,我又做了些许调整,谈不上是改进,但是能应对更对的情况总还是好的,特此记录。 拿发票做例子,印章相较于其它部分最大的不同就是印章是红色的,而其它部分不是(这是一句废话)。 那么第一步当然就是将红色分离出来,这一步可以采用Python第三方库OpenCV里的 cv2.split()方法,该方法是把RGB图像的三个通道拆分开来,得...

wl_Honest的博客 1万+

iOS 富文本简单使用

UITextView *upText = [[UITextView alloc] init]; upText.font = [UIFont systemFontOfSize:14.f]; upText.backgroundColor = [UIColor clearColor]; upText.textColor = [UIColor whiteColor]; upText.textAlignment = NSTextAlignmentLef.

C_philadd的博客 1180

某讯天御滑块验证码逆向实战:从参数解析到环境对抗

本文详细解析了某讯天御滑块验证码的逆向工程实战技巧,从关键参数解析到浏览器环境模拟对抗。重点介绍了collect、eks等参数的逆向思路,以及如何通过puppeteer等工具补全环境检测,帮助开发者有效突破验证码防护。文章还提供了常见错误解决方案和性能优化建议,是验证码逆向领域的实用指南。

weixin_29325007的博客 440

Unreal 从入门到精通之VR常用操作

本文总结了使用Unreal5开发VR项目时遇到的常见问题及其解决方案。首先,介绍了如何通过VRPawn的TryTeleport函数设置玩家视角位置,确保头显移动时安全区域的正确传送。其次,详细说明了如何在Unreal中播放视频,包括导入视频文件、创建媒体播放器和媒体纹理,并将其应用到3D物体上。接着,讲解了如何播放VR全景视频,建议使用MediaPlate媒体板并调整几何体为球体。最后,讨论了如何手动打开和关闭VR模式,以便在PC模式和头显模式之间切换。这些方法为VR开发提供了实用的技术指导。

TxNet 952

iOS支持富文本Label控件

写在前面 都说需求才是技术的最好驱动力,一点也没有错~ 由于在业务开发的过程中经常碰到一些文案需要高亮显示或者是加粗等需求;android 的TextView源生控件是自动支持的,但是对于iOS却没有,所以非常有必要的写一个自定义控件对此功能进行支持;以便于后续用到此功能,大大可以减少开发时间和重复代码。 直接上图,最直观: 首先来个简单一点的,只有一处高亮显示:

人生若只如初见 7791

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

iOS 富文本 隐私协议

利用富文本,制作可点击的隐私协议 #import "ViewController.h" #define font 17 @interface ViewController ()&lt;UITextViewDelegate&gt; @property (weak, nonatomic) IBOutlet UITextView *textview; @property (assign, nonatom...

heqiang2015的博客 989

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IOS 图文富文本推送 UNNotificationServiceExtension UNNotificationContentExtension

iOS 10 自定义推送,图文推送,富文本推送

weixin_43386483的博客 1943

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

iOS 富文本如何添加图片

//联系人:石虎 QQ:1224614774 昵称:嗡嘛呢叭咪哄                        QQ群:807236138  群称:iOS 技术交流学习群 一、概念     1.添加图片效果图     2.富文本添加图片代码     3.富文本总结     4.直接拷贝代码就可以用   二、添加图片效果图 图1: 图2: 三、富文本添加图片代码 /...

石虎 2716

ios html转换富文本,IOS - 富文本解决方案(中)

很多人评论,希望看到后续的章节,我之前一直再维护另一个blog,这个有点废了。我决定以后再把相关的文章给补上。这章主要讲解的是一些原理实现,不涉及到具体的代码,勤奋的人,可以先自己琢磨写写。因为我的代码已经集成到项目中,需要往外摘,还需要花些时间,后续的章节,再把源代码贡献。简介移动端的富文本一直以来,都是一个比较复杂的功能,很多人为了更快速的进行集成和使用,牺牲一些操作性的体验,采用web的模式...

weixin_29978783的博客 1394

iOS 富文本

1、iOS 富文本 1. NSFontAttributeName 设置字体属性,默认值:字体:Helvetica(Neue) 字号:12 2. NSForegroundColorAttributeName 设置字体颜色,取值为 UIColor对象,默认值为黑色 3. NSBackgroundColorAttributeName ...

ITMan_K的博客 521

iOS之富文本

之前做项目时遇到一个问题:     使用UITextView显示一段电影的简介,由于字数比较多,所以字体设置的很小,行间距和段间距也很小,一大段文字挤在一起看起来很别扭,想要把行间距调大,结果在XCode中查遍其所有属性才发现,UITextView居然没有调整行间距的接口,于是忍住不心里抱怨了一下下。     但是问题还是要解决的,上网一查才发现,iOS不仅有富文本处理的功能,而且对于

Gaos的BLOG 1282

直播代码,iOS 原生富文本显示图文

直播代码,iOS 原生富文本显示图文相关的代码 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.view.backgroundColor= [UIColor blackColor]; UILabel *label = [[UILabel alloc]initWith

云豹网络科技 513

ios 富文本

之前做项目时遇到一个问题:     使用UITextView显示一段电影的简介,由于字数比较多,所以字体设置的很小,行间距和段间距也很小,一大段文字挤在一起看起来很别扭,想要把行间距调大,结果在XCode中查遍其所有属性才发现,UITextView居然没有调整行间距的接口,于是忍住不心里抱怨了一下下。     但是问题还是要解决的,上网一查才发现,iOS不仅有富文本处理的功能,而且对于文

yangzm的专栏 861
上一篇: iOS-OC根据时间戳获取距离现在的状态(刚刚,分钟前,今天,昨天)
下一篇: iOS 富文本点击事件
董其林
博客等级 码龄11年 1粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值