【问题标题】:Screenshot in part of UIView masked to UIBezierPath / CGPath部分 UIView 的屏幕截图被 UIBezierPath / CGPath
【发布时间】: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


    【解决方案1】:

    我认为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)
    

    【讨论】:

    • 嘿Pranav,我试过了,但它仍然保存全屏的屏幕截图。另外,我不能只使用边界框,因为绘制的区域是圆形的,所以我也需要尊重那些圆角。
    • 好的。在这种情况下,我认为问题可能出在drawView 框架上。唔。也许值得在过程中调试和打印每一层的帧;我没有复制你的应用,所以不能完全确定。
    • 如果我分享给你,你想看看吗?
    • 我想帮忙,但我可能无法解决问题。 (现在没有很多空闲时间)。如果您能够分享基本演示,我会很乐意尝试?不管怎样,不用担心!
    • 谢谢。我可能会再次问你这个问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2011-01-13
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多