如何解决做一个透明层
我正在尝试在我的应用上实现擦除功能。对于图像,我可以在使用 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
修改的难度(例如更改字体、间距)。这也将使其恢复。
是否可以制作一个可以透视的CALayer
/CAShapeLayer
或UIView
?
Here is an example I have seen on an app.
P.S:我不是在寻找确切的代码,任何实现想法都是可观的。
解决方法
所有视图都有一个“支持层”,包括 UILabel
视图。
因此,您可以在视图层上安装遮罩层。您可以将该蒙版图层设为 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...
}
编辑:
我 posted a demo app on Github 它说明了如何使用 CALayer 屏蔽任何视图。此演示应用程序使用 CGImage 来创建光栅蒙版。您还可以使用 CAShapeLayer 作为矢量蒙版。
这是该项目的自述文件:
MaskableImageView
该项目演示了如何使用 CALayer
屏蔽 UIView
。
它定义了 UIImageView 的一个自定义子类,MaskableView
。
MaskableView
类具有包含 CALayer 的属性 maskLayer
。
MaskableView
在其 didSet
属性上定义了一个 bounds
方法,以便当视图的边界发生变化时,它会调整遮罩层的大小以匹配图像视图的大小。
MaskableView
有一个方法 installSampleMask
,它构建一个与图像视图大小相同的图像,大部分填充不透明的黑色,但中心有一个小矩形填充黑色,alpha 为0.7.半透明的中心矩形使图像视图部分透明并显示下面的视图。
演示应用程序在 MaskableView
中安装了几个子视图、Scampers 的示例图像、我的一只狗和一个 UILabel。它还在 MaskableView
下方安装了棋盘格图像,以便您可以更轻松地看到半透明部分。
MaskableView
具有 circleRadius
、maskDrawingAlpha
和 drawingAction
属性,用于让用户通过点击要更新的视图来擦除/取消擦除图像面具。
MaskableView
将 UIPanGestureRecognizer
和 UITapGestureRecognizer
附加到自身,操作为 gestureRecognizerUpdate
。 gestureRecognizerUpdate
方法从手势识别器中获取点击/拖动位置,并使用它在图像蒙版上绘制一个圆圈,该圆要么减少图像蒙版的 alpha(以部分擦除像素)或增加图像蒙版的 alpha(以使那些像素更不透明。)
MaskableView
的蒙版图很粗糙,仅用于演示目的。它绘制了一系列离散的圆圈,而不是根据用户的拖动手势将路径渲染到遮罩中。更好的解决方案是连接来自手势识别器的点,并使用它们将平滑曲线渲染到蒙版中。
应用程序的屏幕如下所示:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。