swift 制作透明图层

sg3maiej  于 2023-08-02  发布在  Swift
关注(0)|答案(1)|浏览(155)

我正在尝试在我的应用程序上实现擦除功能。对于图像,我可以在使用UIGraphicsBeginImageContextWithOptions绘制图像时将弯曲模式设置为清晰。下面是我用过的代码

UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, 0)
guard let context = UIGraphicsGetCurrentContext() else { return }
image.draw(in: self.bounds)
context.setLineCap(.round)
context.setLineWidth(5)
context.setStrokeColor(UIColor.white.cgColor)
context.setBlendMode(.clear)
context.beginPath()
context.move(to: lastStroke.touchPoint)
context.addLine(to: currentStroke.touchPoint)
context.strokePath()
let updatedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

字符串
它对图像工作得很好。但是我想在UILabel上实现它。
一种可以实现的方法是将UILabel转换为UIImage,这将增加UILabel修改的难度(例如,将UILabel转换为UIImage)。更改字体、间距)。这也将使它复活。
有没有可能做一个可以透视的CALayer/CAShapeLayerUIView
Here is an example I have seen on an app.
P.S:我不是在寻找确切的代码,任何实现的想法将是可观的。x1c 0d1x的数据

nzrxty8p

nzrxty8p1#

iOS中的所有视图都有一个“Backing layer”,包括UILabel视图。(对于Mac OS,并非所有视图都有图层。对于Mac OS NSViews,您必须将视图的wantsLayer属性设置为true,以附加一个层作为视图的“后备存储”。
因此,您可以在视图的图层上安装遮罩图层。你可以将这个遮罩层设置为CAShapeLayer,或者设置为包含CGImage的普通层。
不要混淆混合模式。只需将蒙版图层添加到任何您希望能够擦除/取消擦除的图层,包括UILabel的图层
遮罩层将显示/隐藏它所遮罩的层的内容。(蒙版中的不透明像素显示下面的图层,但透明像素隐藏它。)
如果你想能够做徒手擦除/显示的东西,如标签,我会建议使用一个层与图像在它作为您的面具。将不透明像素绘制到蒙版图像中以“取消擦除”蒙版图像,并使用透明像素绘制以擦除蒙版图像。因为您只是更改遮罩,所以遮罩图像保持不变。

@IBOutlet label: UILabel
var labelMask = CALayer()

字符串
...

func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    // Set up the mask to be the same size as the label view
    labelMask.frame = label.bounds
    label.layer.mask = labelMask
    labelMask.contents = // install a UIImage's CGImage as the contents
    // The rest of your viewDidAppear code goes here...
}

编辑:

它演示了如何使用CALayer屏蔽任何视图。此演示应用程序使用CGImage创建光栅蒙版。也可以将CAShapeLayer用作矢量蒙版。
以下是该项目的自述文件:

MaskableImageView

这个项目演示了如何使用CALayer来屏蔽UIView
它定义了UIImageView的自定义子类MaskableView
MaskableView类有一个包含CALayer的属性maskLayer
MaskableView在其bounds属性上定义了一个didSet方法,以便当视图的边界更改时,它会调整遮罩层的大小以匹配图像视图的大小。
MaskableView有一个方法installSampleMask,它可以构建一个与图像视图大小相同的图像,大部分用不透明的黑色填充,但在中心有一个小矩形,用0.7的alpha填充黑色。半透明的中心矩形使图像视图部分透明,并显示下面的视图。
演示应用程序将几个子视图安装到MaskableView中,一个Scampers的示例图像,我的一只狗和一个UILabel。它还在MaskableView下安装了一个棋盘的图像,这样你就可以更容易地看到半透明的部分。
MaskableView具有circleRadiusmaskDrawingAlphadrawingAction属性,用户可以通过点击视图来更新蒙版,从而擦除/取消擦除图像。
MaskableView将一个UIPanGestureRecognizer和一个UITapGestureRecognizer附加到自身,其操作为gestureRecognizerUpdategestureRecognizerUpdate方法从手势识别器获取点击/拖动位置,并使用它在图像蒙版上绘制一个圆圈,该圆圈可以减小图像蒙版的alpha(以部分擦除像素)或增加图像蒙版的alpha(以使这些像素更不透明)。
MaskableView的遮罩图很粗糙,仅用于演示目的。它绘制一系列离散的圆圈,而不是根据用户的拖动手势将路径渲染到遮罩中。更好的解决方案是连接手势识别器中的点,并使用它们将平滑曲线渲染到遮罩中。
应用程序的屏幕看起来像这样:
x1c 0d1x的数据

相关问题