首页 > 解决方案 > 做一个透视层

问题描述

我正在尝试在我的应用程序上实现擦除功能。对于图像,我可以在绘制图像时将弯曲模式设置为清晰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.

实现它的一种方法是转换UILabelUIImage增加UILabel修改难度(例如更改字体、间距)的。这也将使它恢复。

是否可以制作CALayer/CAShapeLayerUIView可以透视?

这是我在应用程序上看到的一个示例。

PS:我不是在寻找确切的代码,任何实现想法都会很明显。 在此处输入图像描述

标签: iosswiftuikitcore-graphicscalayer

解决方案


所有视图都有一个“支持层”,包括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...
}

编辑:

在 Github 上发布了一个演示应用程序,它说明了如何使用 CALayer 屏蔽任何视图。此演示应用程序使用 CGImage 创建光栅蒙版。您还可以使用 CAShapeLayer 作为矢量蒙版。

这是该项目的自述文件:


MaskableImageView

这个项目演示了如何使用 aCALayer来掩盖 a UIView

它定义了 UIImageView 的自定义子类,MaskableView.

该类MaskableView有一个maskLayer包含 CALayer 的属性。

MaskableView在其属性上定义一个didSet方法,bounds以便当视图的边界发生变化时,它会调整遮罩层的大小以匹配图像视图的大小。

MaskableView 一种方法installSampleMask可以构建与图像视图相同大小的图像,大部分填充不透明的黑色,但在中心有一个小矩形填充黑色,alpha 为 0.7。半透明的中心矩形使图像视图变得部分透明并显示下面的视图。

演示应用程序在 中安装了几个子视图MaskableView、一个 Scampers 的示例图像、我的一条狗和一个 UILabel。它还在下方安装了棋盘图像,MaskableView 以便您可以更轻松地看到半透明部分。

具有MaskableView属性circleRadius, maskDrawingAlpha, 并drawingAction用于让用户通过点击视图来更新蒙版来擦除/取消擦除图像。

将a和 aMaskableView附加到自身,动作为。该方法从手势识别器中获取点击/拖动位置,并使用它在图像蒙版上绘制一个圆圈,以降低图像蒙版的 alpha(以部分擦除像素)或增加图像蒙版的 alpha(以使这些像素更不透明。 )UIPanGestureRecognizerUITapGestureRecognizergestureRecognizerUpdategestureRecognizerUpdate

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

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

在此处输入图像描述


推荐阅读