我正在尝试在我的应用程序上实现擦除功能。对于图像,我可以在使用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
/CAShapeLayer
或UIView
?
Here is an example I have seen on an app.
P.S:我不是在寻找确切的代码,任何实现的想法将是可观的。x1c 0d1x的数据
1条答案
按热度按时间nzrxty8p1#
iOS中的所有视图都有一个“Backing layer”,包括
UILabel
视图。(对于Mac OS,并非所有视图都有图层。对于Mac OS NSViews,您必须将视图的wantsLayer
属性设置为true,以附加一个层作为视图的“后备存储”。因此,您可以在视图的图层上安装遮罩图层。你可以将这个遮罩层设置为CAShapeLayer,或者设置为包含CGImage的普通层。
不要混淆混合模式。只需将蒙版图层添加到任何您希望能够擦除/取消擦除的图层,包括UILabel的图层
遮罩层将显示/隐藏它所遮罩的层的内容。(蒙版中的不透明像素显示下面的图层,但透明像素隐藏它。)
如果你想能够做徒手擦除/显示的东西,如标签,我会建议使用一个层与图像在它作为您的面具。将不透明像素绘制到蒙版图像中以“取消擦除”蒙版图像,并使用透明像素绘制以擦除蒙版图像。因为您只是更改遮罩,所以遮罩图像保持不变。
字符串
...
型
编辑:
它演示了如何使用CALayer屏蔽任何视图。此演示应用程序使用CGImage创建光栅蒙版。也可以将CAShapeLayer用作矢量蒙版。
以下是该项目的自述文件:
MaskableImageView
这个项目演示了如何使用
CALayer
来屏蔽UIView
。它定义了UIImageView的自定义子类
MaskableView
。MaskableView
类有一个包含CALayer的属性maskLayer
。MaskableView
在其bounds
属性上定义了一个didSet
方法,以便当视图的边界更改时,它会调整遮罩层的大小以匹配图像视图的大小。MaskableView
有一个方法installSampleMask
,它可以构建一个与图像视图大小相同的图像,大部分用不透明的黑色填充,但在中心有一个小矩形,用0.7的alpha填充黑色。半透明的中心矩形使图像视图部分透明,并显示下面的视图。演示应用程序将几个子视图安装到
MaskableView
中,一个Scampers的示例图像,我的一只狗和一个UILabel。它还在MaskableView
下安装了一个棋盘的图像,这样你就可以更容易地看到半透明的部分。MaskableView
具有circleRadius
、maskDrawingAlpha
和drawingAction
属性,用户可以通过点击视图来更新蒙版,从而擦除/取消擦除图像。MaskableView
将一个UIPanGestureRecognizer
和一个UITapGestureRecognizer
附加到自身,其操作为gestureRecognizerUpdate
。gestureRecognizerUpdate
方法从手势识别器获取点击/拖动位置,并使用它在图像蒙版上绘制一个圆圈,该圆圈可以减小图像蒙版的alpha(以部分擦除像素)或增加图像蒙版的alpha(以使这些像素更不透明)。MaskableView
的遮罩图很粗糙,仅用于演示目的。它绘制一系列离散的圆圈,而不是根据用户的拖动手势将路径渲染到遮罩中。更好的解决方案是连接手势识别器中的点,并使用它们将平滑曲线渲染到遮罩中。应用程序的屏幕看起来像这样:
x1c 0d1x的数据