图文混排 FTCoreText

iOS开发实战:使用FTCoreText实现UILabel的HTML解析效果 FTCoreText是一个基于iOS原生CoreText框架深度封装的高性能富文本渲染库,旨在解决UILabel无法直接解析HTML字符串的痛点问题。该库通过扩展UILabel的功能,实现对HTML标签的解析与富文本展示,支持字体、颜色、链接、图片等复杂排版需求。相较于使用WKWebView或UIWebView加载HTML内容,FTCoreText在轻量级文本渲染场景中具备显著优势——更低的内存占用、更高的绘制效率,以及更灵活的布局控制能力。 阅读详情

一、图文混排的概念
● 在view上显示的数据既包括文本数据,也包括图片数据。
● 图片的大小可以不同,图片和文字的排列顺序不固定。
● 文本数据的字体、颜色、背景等其他属性可以不同。
● 文本数据中还可以包含超链接。可以点击超链接进入其他页面。
二、研究FTCoreText框架的实现原理
1.此框架的功能 和 缺陷
1.1 功能:此框架能够实现不同风格的文本数据、图片数据的混合显示,还可以设置超链接。
1.2 缺陷:此框架里面的文本的处理只针对与XML或者HTML格式的数据。(比如这种标签类型的数据:春暖花开)对于JSON格式的数据,可能需要自己修改内部一些方法的实现。

2.此框架的基本构成
2.1 此框架有两个类组成,分别是FTCoreTextStyle类、FTCoreTextView类。
2.2 FTCoreTextStyle类主要是用于设置格式的,定义了一些属性和方法。通过这个类就可以定义一种格式。
2.3 FTCoreTextView这个类是此框架的核心类。这个类里面定义了一个私有的类FTCoreTextNode。需要处理的数据中,每一个标签(春暖花开)对应一个节点。节点类里面就封装了一些节点的属性和方法,供FTCoreTextView这个类使用。
2.4 FTCoreTextView这个类主要封装了对数据的处理、绘制图片和文本,其中包含了很多处理细节的方法。
2.5 IOS8新特性:使用FTCoreText前无须导入CoreText.framework框架。

3.FTCoreText框架内部具体的实现原理
3.1 FTCoreTextStyle类的主要实现
3.1.1 FTCoreTextStyle类封装的一些重要的属性:

@property (nonatomic) NSString  *name; //格式的名称
@property (nonatomic) NSString  *appendedCharacter; //追加的字符串
@property (nonatomic) UIFont    *font;  //字体
@property (nonatomic) UIColor   *color;  //颜色
@property (nonatomic, getter=isUnderLined) BOOL underlined; //下划线
@property (nonatomic) FTCoreTextAlignement textAlignment; //文字显示位置
@property (nonatomic) UIEdgeInsets  paragraphInset; //段落之间的间隔
@property (nonatomic) CGFloat   leading;
@property (nonatomic) CGFloat   maxLineHeight; //最大行高
@property (nonatomic) CGFloat   minLineHeight; //最小行高
// bullet 格式
@property (nonatomic) NSString  *bulletCharacter; //设置bullet字符
@property (nonatomic) UIFont    *bulletFont; // 设置bullet字体
@property (nonatomic) UIColor   *bulletColor;  //设置bullet颜色
//当格式被解析时,回调的block
@property (nonatomic, copy) FTCoreTextCallbackBlock     block;
@property (nonatomic, assign) BOOL applyParagraphStyling;  //段落格式</span>

3.1.2 FTCoreTextStyle类封装的一些重要的方法:

//初始化方法
- (id)init
{
    self = [super init];
    if (self) {
        self.name = @"_default";
        self.bulletCharacter = @"•";
        self.appendedCharacter = @"";
        self.font = [UIFont systemFontOfSize:12];
        self.color = [UIColor blackColor];
        self.underlined = NO;
        self.textAlignment = FTCoreTextAlignementLeft;
        self.maxLineHeight = 0;
        self.minLineHeight = 0;
        self.paragraphInset = UIEdgeInsetsZero;
        self.applyParagraphStyling = YES;
        self.leading = 0;
        self.block=nil;
    }
    return self;
}
//类方法,通过name来定义一种格式
+ (id)styleWithName:(NSString *)name
{
    FTCoreTextStyle *style = [[FTCoreTextStyle alloc] init];
    [style setName:name];
    return style;
}

3.2 FTCoreTextNode的主要实现
3.2.1 FTCoreTextNode封装的一些主要的属性:

@property (nonatomic, assign) FTCoreTextNode  *supernode; //父节点
@property (nonatomic) NSArray   *subnodes; //所有子类节点
@property (nonatomic, copy)   FTCoreTextStyle  *style; //定义一种格式
@property (nonatomic) NSRange   styleRange; //定义格式应用的范围
@property (nonatomic) BOOL  isClosed; //是否是关闭
@property (nonatomic) NSInteger  startLocation; //开始的位置
@property (nonatomic) BOOL  isLink; //是否是链接
@property (nonatomic) BOOL  isImage; //是否是图片
@property (nonatomic) BOOL  isBullet; //是否是Bullet
@property (nonatomic) NSString  *imageName;  //图片的名称

3.2.2 FTCoreTextNode封装的一些主要的方法:

//在所有子节点的最后插入一个子节点
- (void)addSubnode:(FTCoreTextNode *)node
{
    [self insertSubnode:node atIndex:[_subnodes count]];
}

//在指定的位置插入子节点
- (void)insertSubnode:(FTCoreTextNode *)subnode atIndex:(NSUInteger)index
{
    //设置父节点
   subnode.supernode = self;
   NSMutableArray *subnodes = (NSMutableArray *)self.subnodes;
    //判断index是否超出数组_subnodes的长度
   if (index <= [_subnodes count]) {
   [subnodes insertObject:subnode atIndex:index];
 }
  else {
  [subnodes addObject:subnode];
  }
}
//获取节点的索引
- (NSUInteger)nodeIndex
{
  return [_supernode.subnodes indexOfObject:self];
}

//获取指定位置的子节点
- (FTCoreTextNode *)subnodeAtIndex:(NSUInteger)index
{
   if (index < [_subnodes count]) {
  return [_subnodes objectAtIndex:index];
  }
   return nil;
}

3.3 FTCoreTextView类的主要实现
3.3.1 FTCoreTextView封装的一些主要的属性:

@property (nonatomic) NSString  *text;  //文本内容
@property (nonatomic) NSString  *processedString; //处理之后的文本
@property (nonatomic, readonly) NSAttributedString  *attributedString;  //属性文本
@property (nonatomic, assign) CGPathRef  path; //路径
@property (nonatomic) NSMutableDictionary  *URLs; //存储所有的URL
@property (nonatomic) NSMutableArray  *images; //存储所有图片
@property (nonatomic, assign) id <FTCoreTextViewDelegate> delegate; //设置代理对象
@property (nonatomic) UIColor *shadowColor; //阴影颜色
@property (nonatomic) CGSize shadowOffset; //阴影大小
@property (nonatomic) BOOL verbose; 
@property (nonatomic) BOOL highlightTouch; //触摸时高亮状态
@property (nonatomic) CTFramesetterRef framesetter; 
@property (nonatomic) FTCoreTextNode *rootNode; //节点
@property (nonatomic, readwrite) NSAttributedString  *attributedString; //属性文本
@property (nonatomic) NSDictionary *touchedData; //点击的文本数据的属性的key和value的映射
@property (nonatomic) NSArray *selectionsViews; //选中的视图
//以下常量是一些默认的标记(标签)名称
extern NSString * const FTCoreTextTagDefault; //默认标记
extern NSString * const FTCoreTextTagImage; //图片标记
extern NSString * const FTCoreTextTagBullet; //Bullet标记
extern NSString * const FTCoreTextTagPage; //< _page / >分页标记    
extern NSString * 
微信小程序图文混排、JS伪交互样例下载 微信小程序图文混排、JS伪交互样例,包括图文混排,数据新增、删除、查询、下拉刷新等,非常具有学习价值 立即下载

相关推荐

微信发送图像 , 图文混排知识点

下载下来直接可以使用 android2.2的包 发送文本和图像的效果和ListView的每次刷新

图文混排.zip

图文混排,欢迎大家下载学习

电商类图文混排瀑布流

基本的图文混排瀑布流;

头歌操作系统2023春季课堂练习2.1:外部中断

本关任务:通过相关知识以及实验回答:版本 1 内核的第 6 次时钟中断发生时,断点和恢复点(指令地址)分别是多少?回答问题:当第一行 0/1 字符全部输出完毕的时候一共发生了几次时钟中断,即第一行完全填满时 jiffies 记录的已发生次数为多少?本关任务:通过实际操作回答在输出第一行 0/1 字符的过程中(如下图所示),共发生了几次时钟中断?2.此时 bochs 虚拟机输出的 0/1 字符串是什么?(只填写数字,不填写空格!根据相关知识进行实际操作,一直输入 c 直到 0/1 将第一行完全填满。

weixin_64821608的博客 8127

修复ASUS in WinRE教程

暑假入手了天选三,发现是win11家庭版,本来想着家庭版将就一下无所谓,结果在使用的过程中发现相较于专业版真的是不能比,于是自己就重装了系统,发现ASUS in WinRE入口不见了,折腾半天最后成功修复。

weixin_46202629的博客 1万+

Cesium实战:如何在前端直接渲染TIFF影像(附完整代码与避坑指南)

本文详细介绍了如何在前端利用Cesium直接加载和渲染TIFF影像的完整技术方案。针对TIFF格式的地理影像数据,文章提供了从文件解析、坐标转换到像素处理与Cesium集成的全流程代码实现,并分享了性能优化与常见问题的避坑指南,帮助开发者高效实现三维地理可视化。

weixin_29290947的博客 314

Windows10检查Cuda和cuDNN是否安装成功?

简介:根据上篇博客已经完成了CUDA和cuDNN的安装步骤,完成对其的安装。下面将来检查它们是否安装成功。 1 .首先win+R进入CMD,在命令行输入nvcc -V,如下图所示,则表示cuda已经安装成功。 2 .进入到cuda的安装路径,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\demo_suite,找到如下两个.exe文件: 首先执行:deviceQuery.exe,查看是否出现如下界面: 然后执行bandwid

jhsignal的博客 14万+

项目管理——14规划绩效域论文套路

规划绩效域论文套路

Flee Elf 1153

别再只用线性回归了!用sklearn的核岭回归搞定非线性数据(附RBF核调参实战)

本文详细介绍了如何使用sklearn的核岭回归处理非线性数据,特别是RBF核的应用与调参实战。通过网格搜索找到最佳参数组合,核岭回归能有效捕捉数据中的复杂波动,显著提升模型性能。适合需要解决非线性问题的数据科学家和机器学习工程师。

weixin_34246529的博客 336

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: autoresizingMask
下一篇: 多线程
Mainning
博客等级 码龄12年 7粉丝 16原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值