ios - 做一个透视层
问题描述
我正在尝试在我的应用程序上实现擦除功能。对于图像,我可以在绘制图像时将弯曲模式设置为清晰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
可以透视?
解决方案
所有视图都有一个“支持层”,包括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(以使这些像素更不透明。 )UIPanGestureRecognizer
UITapGestureRecognizer
gestureRecognizerUpdate
gestureRecognizerUpdate
的MaskableView
面具图很粗糙,仅用于演示目的。它绘制一系列离散的圆圈,而不是根据用户的拖动手势将路径渲染到蒙版中。更好的解决方案是连接来自手势识别器的点,并使用它们将平滑曲线渲染到遮罩中。
该应用程序的屏幕如下所示:
推荐阅读
- sql - 根据 Oracle 版本执行查询
- c# - 如何修复在 LevelValue 更改时生成对象的减少时间
- php - 如何从 HTML 表中获取数据
- memory - 为什么 Racket 在这里以不同的值 (current-memory-use) 开始?
- algorithm - 无法为 while & if 语句找到正确的 Big O
- javascript - 如何避免登录用户通过控制台使用 ajax?
- c# - 将 Asp.net Core API 的结果传递给 Angular
- xml - Adobe LiveCycle:使用 XSLT 进行 XML 到 XML 的转换
- c - 如何查找指针错误?
- python - 设计一个python类