drawRect:我如何做一个"倒置剪辑"

时间:2012-01-28 03:36:07

标签: ios

我正在创建一个iOS用户界面,允许用户在现有图像中选择一个矩形,将该矩形的角拖动到所需的大小。我现在有四个自定义UIButtons(30%alpha)和一个自定义视图(也有30%alpha),它在四个角按钮之间绘制虚线。

为了“改善”界面,我希望我的drawRect代码使图像的裁剪部分看起来“正常”,而裁剪区域外的所有部分都被淘汰(填充白色,这将给我正确的效果因为UIView设置为30%alpha)。

明显的算法是:

  1. 使用[UIColor whiteColor] fill
  2. 填充整个图像
  3. 使用[UIColor clearColor] fill
  4. 绘制四条虚线

    当我这样做时,清除填充没有显示出来。我相信这是因为步骤#2中的清晰颜色的“填充”没有被看到,因为在步骤#1中像素已经被设置为白色。也许有一种混合模式可以让我看到第二个矩形的透明度?我不确定各种混合模式。

    我的第二次尝试有效,可以做到以下几点:

    1. 使用[UIColor clearColor] fill
    2. 绘制四条虚线
    3. 使用[UIColor whiteColor]填充绘制四个额外的矩形,每个矩形表示裁剪区域左侧,右侧,上方和下方的部分。
    4. 正如我所提到的,这种方法有效,但在我看来应该有一种更简单的方法,而不是每次都必须计算这四个额外的矩形。

      在使用CALayer和掩码的SO Create layer mask with custom-shaped hole上有一个类似的问题,但这似乎对我需要的东西有点过分。

      有人对如何改善这一点有任何建议吗?

1 个答案:

答案 0 :(得分:2)

您可以将混合模式设置为kCGBlendModeCopy,然后使用clearColor将像素的alpha重置为零。您可以使用kCGBlendModeClear,但我没有测试过。

您还可以将剪切路径设置为仅包含要清除的像素,然后调用CGContextClearRect(gc, CGRectInfinite)

如果你想使用带有洞的剪贴蒙版,你可以在不使用CALayer的情况下这样做,你可以通过使用偶数来建立它比你链接的答案更简单一点-odd规则和CGRectInfinite

CGContextSaveGState(GC); {
    CGContextBeginPath(gc);
    CGContextAddRect(gc, myRect); // or whatever simple path you want here
    CGContextAddRect(gc, CGRectInfinite);
    CGContextEOClip(gc);

    // drawing code here is clipped to the exterior of myRect

} CGContextRestoreGState(gc);