我正在创建一个iOS用户界面,允许用户在现有图像中选择一个矩形,将该矩形的角拖动到所需的大小。我现在有四个自定义UIButtons(30%alpha)和一个自定义视图(也有30%alpha),它在四个角按钮之间绘制虚线。
为了“改善”界面,我希望我的drawRect代码使图像的裁剪部分看起来“正常”,而裁剪区域外的所有部分都被淘汰(填充白色,这将给我正确的效果因为UIView设置为30%alpha)。
明显的算法是:
当我这样做时,清除填充没有显示出来。我相信这是因为步骤#2中的清晰颜色的“填充”没有被看到,因为在步骤#1中像素已经被设置为白色。也许有一种混合模式可以让我看到第二个矩形的透明度?我不确定各种混合模式。
我的第二次尝试有效,可以做到以下几点:
正如我所提到的,这种方法有效,但在我看来应该有一种更简单的方法,而不是每次都必须计算这四个额外的矩形。
在使用CALayer和掩码的SO Create layer mask with custom-shaped hole上有一个类似的问题,但这似乎对我需要的东西有点过分。
有人对如何改善这一点有任何建议吗?
答案 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);