我正在尝试使我的UIImageView的周围区域变暗,并留下一部分(我用我的面具定义)。
现在我正在定义我的面具并设置我的imageView.layer.mask,但不是使图像的其余部分变暗,而是将其完全删除。
我想要的效果类型示例:
我得到的例子:
参考文档提到掩码使用它的图层的alpha,所以我试图操纵蒙版的不透明度。然而,这似乎只会影响我想单独留下的部分的不透明度,而图像的其余部分仍然完全被剪掉。
有谁可以指出我做错了什么?感谢。
这是我的代码:
CAShapeLayer *mask = [CAShapeLayer layer];
GMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, nil, 1052, 448);
CGPathAddLineToPoint(path, nil, 2, 484);
CGPathAddLineToPoint(path, nil, 54, 1263);
CGPathAddLineToPoint(path, nil, 56, 1305);
CGPathAddLineToPoint(path, nil, 380, 1304);
CGPathAddLineToPoint(path, nil, 1050, 1311);
CGPathCloseSubpath(path);
mask.path = path;
CGPathRelease(path);
//mask.opacity = 0.5; //doesn't affect the surrounding portion, only the cut out area.
self.imageView.layer.mask = mask;
答案 0 :(得分:4)
你做错了就是首先使用图层蒙版。您试图遮挡或变暗图像的某个区域。这不是图层蒙版的功能!基本上,图层蒙版在现有图层中穿透,导致其后面的后面显示的内容。这正是你发现的:
它完全删除它
是的,因为这就是图层蒙版所做的!如果你不想那样,你为什么要使用图层蒙版?
你想要的只是在第一个图像视图(或者只是一个子图层)上放置 。它包含您绘制的图像。它是透明的,除非它有一个半透明的深色填充。这会使背后的东西变暗。您使用剪切路径来定义无法获得深色填充的区域。
或者,通过使用合成或可能使用CIFilter在其顶部绘制来更改图像视图中的图像。
答案 1 :(得分:1)
如果其他人有相同的问题:如果目标是使图层变暗,则不适合使用遮罩。但是,如果您需要使图像的一部分透明或半透明,那绝对是个好方法。
例如,此代码可以存在于NSView子类中:
let imageLayer = CALayer()
let maskLayer = CAShapeLayer()
let ovalPath = NSBezierPath(ovalIn: bounds)
maskLayer.path = ovalPath
maskLayer.autoresizingMask = [.layerWidthSizable, .layerHeightSizable]
maskLayer.frame = bounds
maskLayer.backgroundColor = NSColor.black.withAlphaComponent(0.2).cgColor
imageLayer.contents = NSImage(named: "sampleImage")
imageLayer.autoresizingMask = [.layerWidthSizable, .layerHeightSizable]
imageLayer.frame = bounds
imageLayer.mask = maskLayer
这会使imageLayer
中的椭圆形“孔”具有0.2的不透明度。