简单的Coretext 图文混排
在很多新闻类或有文字展示的应用中现在都会出现图文混排的界面例如网易新闻等,乍一看去相似一个网页,其实这样效果并非由UIWebView 加载网页实现。现在分享一种比较简单的实现方式

iOS sdk中为我们提供了一套完善的文字排版开发组件:CoreText。CoreText库中提供了很多的工具来对文本进行操作,例如CTFont、CTLine、CTFrame等。利用这些工具可以对文字字体每一行每一段落进行操作。
此例中默认图片都在右上方,且为了美观和开发简便设定所占宽度都相同。
1. 首先,需要引入CoreText库
在需要使用的类文件中添加#import <CoreText/CoreText.h>头文件。
2. 设置文本的参数
创建一个NSMutableAttributedString对象,包含所需展示的文本字符串。这样就可以对其进行设置了。通过 CTFontCreateWithName函数创建一个CTFont对象,利用NSMutableAttributedString对象的 addAttribute方法进行设置。类似的方法可以设置字间距。
对其方式与行间距的设置方式:
[cpp]
// 文本对齐方式
CTTextAlignment alignment = kCTLeftTextAlignment;
CTParagraphStyleSetting alignmentStyle;
alignmentStyle.spec = kCTParagraphStyleSpecifierAlignment;
alignmentStyle.valueSize = sizeof(alignment);
alignmentStyle.value = &alignment;
// 创建设置数组
CTParagraphStyleSetting settings[] ={alignmentStyle};
CTParagraphStyleRef style = CTParagraphStyleCreate(settings, 1);
同样使用addAttribute设置字符串对象。这样的方法还可以设置行间距,段间距等参数。
3. 计算图片所占高度。图片可以使用UIImageView 来进行显示。很容易便可获取每张图片所占总高度。
4.
由于图片宽度是固定的这样就可以计算每行文字缩短的字数。只要文本的总体高度低于图像总高度则文字长度都是缩短的。用
CTTypesetterSuggestLineBreak函数动态的计算每一行里的字数,因为每一行里面的中文字、标点符号、数字、字母都不一样所以可
以显示的字数肯定也是不同的,所以需要作这样的计算。这样循环直至文本结束,就可以知道有多少行字了。再根据字体高度和行间距得出总的文本高度,如果文本
高度大于图片总高度那么显示区域的Frame高度就是文本的高度,反之亦然。
5. 绘制文本:
设置每一行绘制文本的区间:
[cpp]
CFRange lineRange = CFRangeMake(currentIndex, lineLength);
建立文本行对象
CTLineRef line = CTTypesetterCreateLine(typeSetter, lineRange);
CGFloat x = [self textOffsetForLine:line inRect:self.bounds];
// 设置一行的位置
CGContextSetTextPosition(context, x, y);
// 绘制一行文字
CTLineDraw(line, context);
6. 其他功能:
在完成文本绘制功能后可以加入调整文字大小的功能,和图片的放大的功能。
文字大小可以通过直接设置字体大小后重新绘制文本来实现。
图片放大可以在视图上添加一个新的UIImageView 来展示放大后的图片,并且加入动画效
简单的Coretext 图文混排的更多相关文章
- CoreText 图文混排
基本原理 https://www.cnblogs.com/purple-sweet-pottoes/p/5109413.html CoreText(一):基本用法 https://blog.csdn ...
- CoreText实现图文混排之点击事件
今天呢,我们继续把CoreText图文混排的点击事件补充上,这样我们的图文混排也算是圆满了. 哦,上一篇的链接在这里 http://www.jianshu.com/p/6db3289fb05d Cor ...
- Coretext实现图文混排及Gif图片播放
CoreText是iOS3.2推出的一套文字排版和渲染框架,可以实现图文混排,富文本显示等效果. CoreText中的几个重要的概念: CTFont CTFontCollection CTFontD ...
- CoreText实现图文混排之文字环绕及点击算法
系列文章: CoreText实现图文混排:http://www.jianshu.com/p/6db3289fb05d CoreText实现图文混排之点击事件:http://www.jianshu.co ...
- iOS 图文混排 链接 可点击
对于这个话题 我想到 1 第一个解决方法就是使用 webView 比较经典 把所有复杂工作都交给控件本身去处理了, 但是好像好多需要自定义的地方 没法从 webView获得响应回调 :(估计也可以实 ...
- 图文混排--CoreText的简单运用
常见的在一些微博微信中可以看见一段文字中有不同的字体,字体有不同的颜色,并且可能会有一些笑脸之类的表情,这些可以通过图文混排做到. 图文混排可以通过WebView和CoreText做到,其他还有别的方 ...
- 【iOS】使用CoreText实现图文混排
iOS没有现成的支持图文混排的控件,而要用多个基础控件组合拼成图文混排这样复杂的排版,是件很苦逼的事情.对此的解决方案有使用CoreText进行绘制,或者使用TextKit.本文主要讲解对于CoreT ...
- CoreText实现图文混排之点击事件-b
CoreText实现图文混排之点击事件 主要思路 我们知道,CoreText是基于UIView去绘制的,那么既然有UIView,就有 -(void)touchesBegan:(NSSet<UIT ...
- CoreText 实现图文混排
CoreText 实现图文混排 相关博文推荐 IOS CoreText.framework - 基本用法 IOS CoreText.framework - 段落样子CTParagraphStyle h ...
随机推荐
- Android @+id与@id的区别
Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id属性值.id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等. 如果在@ ...
- xcode KVC:Key Value Coding 键值编码
赋值 // 能修改私有成员变量 - (void)setValue:(id)value forKey:(NSString *)key; - (void)setValue:(id)value forKey ...
- windows下安装tern for vim
操作系统:windows8.1 64位 vim:gvim7.4 1.下载tern for vim,去官网直接下载,连接好像都是到github上(https://github.com/marijnh ...
- matlab GUI之常用对话框(二)-- 进度条的使用方法
常用对话框(二) 进度条 waitbar 调用格式: h = waitbar(x,'message') waitbar(x,'message','CreateCancelBtn','button ...
- MSSQL 当前会话设置隔离级别与查询
之前因为MySQL没有with(nolock)这种写法,于是想设置隔离级别,结果被坑. 直觉以为和MSSQL一样只要打set transaction isolation level xxx 就能搞定 ...
- win7(32 bit) 环境下点击打印预览报错解决办法
如题,报错截图如下 : 解决办法如下: 1.关闭系统数据执行保护.具体操作: 在win7 系统命令行中执行如下命令: bcdedit.exe /set {current} nx Alw ...
- JAVA编译中拒绝访问的问题及解决方案
在java编译时出现,可以将C盘内的文件转移到其他盘,此问题可能是权限不足不能够读取C盘文件造成的. 文件名与类名要一致,包括大小写,也是要一致!
- JSP标签库
step1: 定义一个标签处理类:改类必须实现SimpleTag接口,在实际中是拓展它的子类SimpleTagSupport.复写doTag方法 public class MyTag extends ...
- mysql 正确的关闭方式
./bin/mysqladmin -uroot -p123456 -S /home/allen/var/mysql/mysql.sock shutdown
- 在输出视图中使用使用html注释会导致在Chrome中css失效
在做SportsStore例子时,在视图List.cshtml中使用了html注释,即 <!-- 注释 --> 结果在加载css时,chrome浏览器中所有css效果都失效.IE不受影响. ...