我正在构建绘图应用程序。我正在使用 CGMutablePath
绘图。
我希望用户能够选择绘制路径的一部分,然后移动该部分,如下所示:
我想,一个可能的解决方案是将一个 View 遮盖到绘制区域,然后在该 View 中截取屏幕截图。
在这里,你可以看到我要截屏的绘制区域:
为了截取屏幕截图,我绘制了 last
路径,即要截取屏幕截图的区域:
let shapeLayer = CAShapeLayer()
shapeLayer.path = last.closedPath // returns CGPath.closeSubpath()
shapeLayer.lineWidth = 10
然后我创建了一个 overlayView
,这是我正在截屏的 View 。
let overlayView = UIView(frame: view.bounds)
overlayView.backgroundColor = .black
overlayView.alpha = 0.4
view.addSubview(overlayView)
view.bringSubview(toFront: overlayView)
然后我将 View 屏蔽到路径:
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
具有屏幕的完整尺寸,并且还以完整尺寸绘制屏幕截图。
在调试 View 层次结构时,我还可以看到 overlayView
仍然是全尺寸的,没有屏蔽路径。
因此,我不是只获取绘制的部分作为屏幕截图,而是获取整个 View /屏幕的图像。
问题
如何成功地将 View 屏蔽到绘制区域,以便我只能在屏幕的那部分截取屏幕截图?
最佳答案
我认为 overlayView.frame
等于 self.view.frame
,这就是图像全屏显示的原因。
你的问题的一个解决方案可能如下解决(虽然我可能理解有误):
let shapeLayer = CAShapeLayer()
shapeLayer.path = last.closedPath // returns CGPath.closeSubpath()
shapeLayer.lineWidth = 10
let rect = shapeLayer.path.boundingBoxOfPath
let overlayView = UIView(frame: rect)
关于swift - 部分 UIView 的屏幕截图被屏蔽为 UIBezierPath/CGPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50397059/