绘制透明图层
- 调用CGContextBeginTransparencyLayer开始透明层
- 绘制组合对象
- 调用CGContextEndTransparencyLayer结束透明层
CGContextSetShadowWithColor(context, CGSizeZero, 10, [UIColor yellowColor].CGColor);
CGContextBeginTransparencyLayer(context, NULL);
CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
CGContextFillEllipseInRect(context, CGRectMake(100, 150, 100, 100));
CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor);
CGContextFillEllipseInRect(context, CGRectMake(150, 100, 100, 100));
CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);
CGContextFillEllipseInRect(context, CGRectMake(150, 150, 100, 100));
CGContextEndTransparencyLayer(context);
注意
CGContextSetShadowWithColor一定要在CGContextBeginTransparencyLayer透明层开始之前。
因为CGContextBeginTransparencyLayer与CGContextEndTransparencyLayer之间是一个整体,你可以把整个看做是一个对象,阴影作用在整个对象上面,如果写在CGContextBeginTransparencyLayer之后,那么就变成内部组合对象每一个都有阴影。 也就是说写不写透明层都没有关系了。 如下图没有加透明层或者阴影写在了透明层内部,可以看到视图层叠处也有阴影。
原因:
Quartz透明层可以理解为一个对象组,对象组里面又有多个对象。效果都会作用域对象组。Quartz为每一个上下文维护一个透明层栈。可以嵌套。当CGContextEndTransparencyLayer调用后,Quartz讲对象放入上下文。并使用上全文的全局alpha值、阴影状态、剪裁区域作用域对象组。