在我的自定义控件中,我定义了一些带有所需线条和弧线的CGMutablePathRefs来绘制我的控件;一个绘制整体填充形状,另一个绘制镜面高光。我还定义了两个CGMutablePathRefs,它们包含作为控件的活动和非活动状态的剪切掩码所需的路径。
我正在努力应用裁剪路径。我以前使用剪切路径将渐变应用于图像,但那些绘图命令是CGContext ...变种,而不是CGPath ...变种。
出于测试目的,我删除了镜面高光绘图方面,只是试图将一条大路径剪切到较小的路径。这是我一直在测试的:
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextBeginPath(ctx);
CGContextAddPath(ctx, inactiveClip);
CGContextClosePath(ctx);
CGContextClip(ctx);
CGContextAddPath(ctx, frontFace);
CGContextSetLineWidth(ctx, 1.0);
CGContextSetFillColorWithColor(ctx, [[UIColor blackColor] CGColor]);
CGContextFillPath(ctx);
}
通过在任何绘图之前放置剪切命令,我以为我在对CoreGraphics说,“这是你应该实际绘制的区域。”
唉,什么都没画。所以假设我向后排序,我试过:
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextAddPath(ctx, frontFace);
CGContextSetLineWidth(ctx, 1.0);
CGContextSetFillColorWithColor(ctx, [[UIColor blackColor] CGColor]);
CGContextFillPath(ctx);
CGContextBeginPath(ctx);
CGContextAddPath(ctx, inactiveClip);
CGContextClosePath(ctx);
CGContextClip(ctx);
}
这是对CoreGraphics的说法,“好吧,在你真正对比特进行着色之前,请检查它们是否与这个裁剪区域对比。”
唉,什么都没有被剪掉。
由于我的裁剪路径使用了一些相同的点和控制点,顺序与填充路径一样,我也用CGContextEOClip调用替换了对CGContextClip的调用,看我是不是真的与奇怪的规则作斗争,但这似乎没有任何视觉影响。
我真的不知道是否需要将CGContextAddPath调用与CGContextBeginPath / CGContextClosePath调用括起来,但我试图做的是最小化Apple示例代码和我的代码之间的差异。在他们的CGContext中......在开始/结束通话之间绘制呼叫,所以我也是。
我在这里误解了什么?