动态 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))
不确定在哪里寻找这个,但我想创建一个半透明的视图或图层蒙版,可以移动、更改不透明度并在屏幕上同时显示多个重叠。
类似的东西:
两个小盒子可以四处移动并改变颜色的不透明度。
我试过使用 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))