面试题答案
一键面试实现思路
- 创建图形上下文:使用
UIGraphicsBeginImageContextWithOptions
创建一个基于位图的图形上下文,以便后续绘制操作。 - 定义路径:使用
CGContext
相关函数创建包含多个子路径的复杂路径。 - 设置填充规则:分别使用
CGContextSetFillRule
设置非零环绕数填充规则(kCGFillRuleEvenOdd
)和奇偶填充规则(kCGFillRuleNonZero
)。 - 绘制并填充路径:使用
CGContextFillPath
填充路径。 - 获取绘制结果:结束图形上下文并获取绘制的图像。
关键代码
// 创建一个大小为200x200的图像上下文
UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), NO, 0.0);
CGContextRef context = UIGraphicsGetCurrentContext();
// 创建一个路径
CGMutablePathRef path = CGPathCreateMutable();
// 添加子路径示例,这里以简单的矩形和圆形为例
CGPathAddRect(path, NULL, CGRectMake(50, 50, 100, 100));
CGPathAddEllipseInRect(path, NULL, CGRectMake(75, 75, 50, 50));
// 使用非零环绕数填充规则填充
CGContextSetFillRule(context, kCGFillRuleNonZero);
CGContextAddPath(context, path);
CGContextFillPath(context);
// 获取当前绘制的图像
UIImage *imageWithNonZeroRule = UIGraphicsGetImageFromCurrentImageContext();
// 清空上下文
UIGraphicsEndImageContext();
// 再次创建图像上下文
UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), NO, 0.0);
context = UIGraphicsGetCurrentContext();
// 使用奇偶填充规则填充
CGContextSetFillRule(context, kCGFillRuleEvenOdd);
CGContextAddPath(context, path);
CGContextFillPath(context);
// 获取当前绘制的图像
UIImage *imageWithEvenOddRule = UIGraphicsGetImageFromCurrentImageContext();
// 释放路径
CGPathRelease(path);
// 结束上下文
UIGraphicsEndImageContext();
在上述代码中,首先创建了一个复杂路径,然后分别使用非零环绕数填充规则和奇偶填充规则填充路径,并获取对应的绘制图像。注意要及时释放创建的CGMutablePathRef
路径对象以及正确管理图形上下文。