【发布时间】:2018-10-28 01:16:49
【问题描述】:
我正在构建一个绘图应用程序。我正在使用CGMutablePath 绘图。
我希望用户能够选择绘制路径的一部分,然后移动该部分,如下所示:
我认为,一种可能的解决方案是屏蔽绘制区域的视图,然后在该视图中截屏。
在这里,您可以看到我要截屏的区域:
为了截屏,我绘制了last 路径,即要截屏的区域:
let shapeLayer = CAShapeLayer()
shapeLayer.path = last.closedPath // returns CGPath.closeSubpath()
shapeLayer.lineWidth = 10
然后我创建一个overlayView,这就是我截取屏幕截图的视图。
let overlayView = UIView(frame: view.bounds)
overlayView.backgroundColor = .black
overlayView.alpha = 0.4
view.addSubview(overlayView)
view.bringSubview(toFront: overlayView)
然后我将视图隐藏到路径:
overlayView.mask(withPath: UIBezierPath(cgPath: last.closedPath!))
.mask(withPath:) 方法来自这里:
extension UIView {
func mask(withPath path: UIBezierPath) {
let path = path
let maskLayer = CAShapeLayer()
maskLayer.path = path.cgPath
self.layer.mask = maskLayer
}
}
然后,我在overlayView截图:
let image: UIImage = {
UIGraphicsBeginImageContextWithOptions(overlayView.bounds.size, false, 0)
defer { UIGraphicsEndImageContext() }
drawView.drawHierarchy(in: overlayView.bounds, afterScreenUpdates: true)
return UIGraphicsGetImageFromCurrentImageContext()!
}()
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
发生的情况是,overlayView 具有屏幕的全尺寸,并且还以全尺寸绘制屏幕截图。
在调试视图层次结构时,我还可以看到overlayView 仍然是全尺寸的,没有被路径屏蔽。
因此,我获得了整个视图/屏幕的图像,而不是仅将绘制的部分作为屏幕截图。
问题
如何成功地将视图屏蔽到绘制区域,以便仅在屏幕的该部分截屏?
【问题讨论】:
标签: swift mask uibezierpath cgpath