一、仿真翻页UIPageViewController
1.1 UIPageViewController实现相关代理
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController向前翻页
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController向后翻页
- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray<UIViewController *> *)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填充图片占位
一张草图说明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绘制图片