drawRect:我如何做一个“倒扣”

我正在创build一个iOS用户界面,允许用户在现有图像中select一个矩形,并将该矩形的边angular拖动到所需的大小。 我现在有四个自定义UIButtons(30%阿尔法)和一个自定义视图(也有30%阿尔法),在四个angular落button之间绘制虚线。

为了“改善”界面,我希望我的drawRect代码使裁剪的图像部分显示为“正常”,而裁剪区域外的所有东西都被冲掉了(用白色填充,这会给我正确的效果,因为UIView被设定为30%α)。

显而易见的algorithm是:

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

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

我的第二次尝试,工作,做了以下几点:

  1. 用[UIColor clearColor]填充绘制四条虚线
  2. 用[UIColor whiteColor]填充绘制四个附加矩形,每个矩形代表裁剪区域的左侧,右侧,上方和下方的部分。

正如我所说,这种方法是有效的,但在我看来,应该有一个更简单的方法,而不是我每次都必须计算这四个额外的矩形。

对于使用CALayer和蒙版的自定义孔创build图层蒙版也有类似的问题,但这似乎是我所需要的矫枉过正。

有没有人对如何改善这个问题有什么build议?

您可以将混合模式设置为kCGBlendModeCopy并使用clearColor将像素的alpha重置为零。 你大概也可以使用kCGBlendModeClear但我没有testing过。

您还可以设置剪切path以包含要清除的像素,并调用CGContextClearRect(gc, CGRectInfinite)

如果你想使用带有洞的剪贴蒙版,你可以不使用CALayer ,而且可以通过使用偶数规则和CGRectInfinite来构build它,而不是使用链接的答案。

 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);