swift - 部分 UIView 的屏幕截图被屏蔽为 UIBezierPath/CGPath

标签 swift mask uibezierpath cgpath

我正在构建绘图应用程序。我正在使用 CGMutablePath 绘图。
我希望用户能够选择绘制路径的一部分,然后移动该部分,如下所示:

selection demo

我想,一个可能的解决方案是将一个 View 遮盖到绘制区域,然后在该 View 中截取屏幕截图。
在这里,你可以看到我要截屏的绘制区域:

selecting an area

为了截取屏幕截图,我绘制了 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/

相关文章:

ios - 可以用两个 iOS 模拟器测试 multipeer 而在 mac 上没有设备吗?

r - R 中的屏蔽函数列表

Java 按位与运算符

ios - UIBezierPath 点在路径的一部分

ios - Swift:根据父 View 大小动态调整/缩放 UIBezierPath

swift - 根据百分比填充描边颜色,即 80%、70% 或任何其他百分比

ios - 在通话期间播放音乐 iOS Swift

swift - 什么替换了 init(name :float:) now that it has been deprecated

ios - KDCircularProgressView 不显示

javascript - 替换/屏蔽字符串中的替代 N 个字符