微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

做一个透明层

如何解决做一个透明层

我正在尝试在我的应用上实现擦除功能。对于图像,我可以在使用 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/CAShapeLayerUIView

Here is an example I have seen on an app.

P.S:我不是在寻找确切的代码,任何实现想法都是可观的。

enter image description here

解决方法

所有视图都有一个“支持层”,包括 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 具有 circleRadiusmaskDrawingAlphadrawingAction 属性,用于让用户通过点击要更新的视图来擦除/取消擦除图像面具。

MaskableViewUIPanGestureRecognizerUITapGestureRecognizer 附加到自身,操作为 gestureRecognizerUpdategestureRecognizerUpdate 方法从手势识别器中获取点击/拖动位置,并使用它在图像蒙版上绘制一个圆圈,该圆要么减少图像蒙版的 alpha(以部分擦除像素)或增加图像蒙版的 alpha(以使那些像素更不透明。)

MaskableView 的蒙版图很粗糙,仅用于演示目的。它绘制了一系列离散的圆圈,而不是根据用户的拖动手势将路径渲染到遮罩中。更好的解决方案是连接来自手势识别器的点,并使用它们将平滑曲线渲染到蒙版中。

应用程序的屏幕如下所示:

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。