CTLineDraw文档中“图形上下文可处于任意状态”含义及上下文异常解决
关于CTLineDraw对CGContext状态的影响及解决方案
我来帮你拆解这个问题,其实你遇到的情况完全符合Core Text文档的描述,咱们一步步理清楚:
文档那句话到底是什么意思?
此调用可使图形上下文处于任意状态,且绘制操作后不会刷新上下文
这句话的核心是说:CTLineDraw在绘制文本的过程中,会直接修改CGContext的内部状态(比如当前的变换矩阵、填充/描边颜色、裁剪区域、字体相关设置甚至绘图模式等),而且它完全不会负责任何“善后工作”——也就是不会把这些状态恢复到你调用它之前的样子。
举个实际的例子:假设你调用CTLineDraw之前,已经把上下文的填充色设为红色,结果CTLineDraw在内部把填充色改成了透明(或者其他你不需要的颜色),而且绘制完之后没改回去,那你之后再调用填充矩形的方法,自然就看不到效果了。类似的,它也可能修改了变换矩阵,让你后续绘制的矩形被移到了屏幕外,或者设置了裁剪区域把矩形挡住了。
保存恢复上下文状态是否有效?当然有效!
这正是解决这类上下文状态污染问题的标准操作,而且非常推荐你这么做。具体来说,你只需要在调用CTLineDraw之前保存当前上下文的所有状态,绘制完成后再把状态恢复回来,就能确保后续的绘图操作不受影响。
给你一个简单的代码示例:
// 先保存当前上下文的所有状态(包括颜色、变换、裁剪等) CGContextSaveGState(context); // 执行Core Text的绘制操作 CTLineDraw(line, context); // 恢复上下文到保存前的状态,相当于把被CTLineDraw修改的状态全部还原 CGContextRestoreGState(context); // 现在再执行填充矩形的操作,就会用你原来设置的上下文状态了 CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor); CGContextFillRect(context, CGRectMake(10, 10, 50, 50));
其实不止Core Text,在Core Graphics的绘图场景里,只要你调用的某个函数可能会修改上下文状态(尤其是系统提供的、你没法完全掌控内部逻辑的函数),都应该用CGContextSaveGState和CGContextRestoreGState来包裹,避免后续的绘图逻辑被意外影响。
内容的提问来源于stack exchange,提问作者Unsacrificed
相关产品推荐
相关产品推荐

