动态 UIView 上的半透明动态遮罩

Semi transparent dynamic mask on over dynamic UIView

不确定在哪里寻找这个,但我想创建一个半透明的视图或图层蒙版,可以移动、更改不透明度并在屏幕上同时显示多个重叠。

类似的东西:

两个小盒子可以四处移动并改变颜色的不透明度。

我试过使用 CALayer 面具,但那只是穿孔,所以我在孔中添加了一个 CAShapeLayer,但你可以看到边缘。我尝试在 CAShapeLayer 上使用 allowsEdgeAntialiasing,但这似乎不起作用。

我见过的其他示例仅适用于 UIImageViews,因为它们使用两个 UIImageViews 彼此叠加来获得效果。不幸的是,我需要它来处理任何类型的 UIView。

我也试过使用 CGBlendMode.SourceOut 效果很好,除了重叠区域更亮,这很有意义,但不是我想要的。

let blendMode = CGBlendMode.SourceOut

CGContextSaveGState(context)

CGContextSetFillColorWithColor(context, UIColor(white: 0.0, alpha: 0.75).CGColor)
CGContextFillRect(context, rect)

CGContextSetBlendMode(context, blendMode)

CGContextSetFillColorWithColor(context, UIColor(white: 0.0, alpha: 0.25).CGColor)
CGContextFillRect(context, CGRectMake(0, 500, 60, 50))

CGContextSetFillColorWithColor(context, UIColor(white: 0.0, alpha: 1).CGColor)
CGContextFillRect(context, CGRectMake(0, 550, 60, 50))

最后两个填充矩形重叠,第一个是将整个视图设置为半透明覆盖。

看起来你可以使用混合模式:

  • 背景正常
  • 清除方块的孔
  • 方块再次正常以呈现重叠外观

当第二个框设置为与背景相同的 alpha 时,这似乎没有显示正方形周围的边缘

此代码生成顶部图像(在 drawRect 中调用):

CGContextSetBlendMode(context, CGBlendMode.Normal)
CGContextSetFillColorWithColor(context, UIColor(white: 0.0, alpha: 0.75).CGColor)
CGContextFillRect(context, rect)

CGContextSetBlendMode(context, CGBlendMode.Clear)
CGContextSetFillColorWithColor(context, UIColor(white: 0.0, alpha: 1).CGColor)
CGContextFillRect(context, CGRectMake(20, 150, 100, 100))
CGContextSetFillColorWithColor(context, UIColor(white: 0.0, alpha: 1).CGColor)
CGContextFillRect(context, CGRectMake(50, 200, 100, 100))

CGContextSetBlendMode(context, CGBlendMode.Normal)
CGContextSetFillColorWithColor(context, UIColor(white: 0.0, alpha: 0.25).CGColor)
CGContextFillRect(context, CGRectMake(20, 150, 100, 100))
CGContextSetFillColorWithColor(context, UIColor(white: 0.0, alpha: 0.15).CGColor)
CGContextFillRect(context, CGRectMake(50, 200, 100, 100))