iOS CoreText文字图片排版及实现仿真翻页

demo实现效果.gif

一、仿真翻页UIPageViewController

1.1 UIPageViewController实现相关代理

  • (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController向前翻页
  • (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController向后翻页
  • (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers将要翻页

1.2 UIPageViewController需要注意相关事项

翻页时注意第一页和最后一页,快速点击时会越界。需要做越界处理

二、CoreText排版

2.1解析

json文件->NSAttributedString->CFAttributedStringRef->CTFramesetterRef->CTFrameRef

2.1.1json文件->NSAttributedString解析

颜色、字体、段落缩进相关属性在这一步进行设置
图片占一个位置

2.1.2CTFramesetterRef->CTFrameRef解析

一个CTFrameRef是一个区块,在此可以理解为一页,多个CTFrameRef构成多页
一个CTFrameRef显示多少内容,是系统根据CGPathRef大小自动计算的
strLength总长度,textPos当前解析位置,根据textPos< strLength解析是否完成

2.1.3CoreText内存问题

所有Create出来的都要手动释放,如CTFramesetterCreateWithAttributedString、CGPathCreateWithRect、CTFramesetterCreateFrame

2.1.3填充图片占位
iOS CoreText文字图片排版及实现仿真翻页_第1张图片
31556672643_.pic.jpg

一张草图说明CTFrameRef,CTLine,CTRun之间的关系。CTFrameRef是一整块,CTLine就是一行,CTRun就是行中的元素

图片占位,遍历CTFrame->CTLine->CTRun
CTRunDelegateRef delegate = (__bridge CTRunDelegateRef)[runAttributes valueForKey:(id)kCTRunDelegateAttributeName];//判断是否有占位
可以得到图片对应的位置,偏移量和图片大小等数据。

2.2绘制

2.2.1坐标

CoreText坐标是以左下角为原点的,而手机屏幕是以左上角为原点的。坐标系需要做个旋转,先平移屏幕高度,再沿X轴做180°翻转。
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
CGContextTranslateCTM(context, 0, configManager.height);
CGContextScaleCTM(context, 1.0, -1.0);

2.2.2文本和图片绘制

CTFrameDraw绘制文字
CGContextDrawImage绘制图片

总结:本篇为CoreText入门。最后附上demo

参考文章: iOS:基于CoreText的排版引擎

你可能感兴趣的:(iOS CoreText文字图片排版及实现仿真翻页)