Ios drawRect:我该如何做;倒扣;

Ios drawRect:我该如何做;倒扣;,ios,Ios,我正在创建一个iOS用户界面,允许用户在现有图像中拾取一个矩形,并将该矩形的角拖动到所需的大小。我现在有四个自定义UIButton(30%alpha)和一个自定义视图(也有30%alpha),用于在四个角按钮之间绘制虚线 为了“改进”界面,我希望我的drawRect代码使图像的裁剪部分看起来“正常”,而裁剪区域之外的所有内容都被洗掉(填充白色,这将给我正确的效果,因为UIView设置为30%alpha) 显而易见的算法是: 用[UIColor whiteColor]填充整个图像 使用[UICol

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

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

显而易见的算法是:

  • 用[UIColor whiteColor]填充整个图像
  • 使用[UIColor clearColor]填充绘制四条虚线
  • 当我这样做的时候,没有出现明显的填充。我相信这是因为在第2步中没有看到清晰颜色的“填充”,因为在第1步中像素已经设置为白色。也许有一个混合模式可以让我看到第二个矩形的透明度?我不确定各种混合模式

    我的第二次尝试有效,它执行以下操作:

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

    有一个类似的问题,所以,使用CALayer和面具,但这似乎是过度杀伤力为我所需要的


    有人对如何改进这一点有什么建议吗?

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

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

    如果要使用带有孔的剪切遮罩,可以不使用
    CALayer
    ,也可以使用奇偶规则和
    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);
    

    kCGBlendModeClear
    似乎成功了!谢谢!