【问题标题】:How to save screenshot of a view with its subviews in Swift?如何在 Swift 中保存视图的屏幕截图及其子视图?
【发布时间】:2017-03-04 10:37:30
【问题描述】:

我想捕获一个带有子视图的视图。我正在使用此代码来捕获屏幕:

let view = self.faceTrackerContainerView

UIGraphicsBeginImageContext(CGSizeMake(view.bounds.size.width, view.bounds.size.height))
UIGraphicsGetCurrentContext()!
self.view?.drawViewHierarchyInRect(view.frame, afterScreenUpdates: true)
let screenshot = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

UIImageWriteToSavedPhotosAlbum(screenshot, nil, nil, nil)

这些代码捕获整个屏幕,包括视图前面的按钮。我尝试了这些代码,但它只捕获了主视图,不包括其子视图:

let view = self.faceTrackerContainerView
let scale = UIScreen.mainScreen().scale
UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, scale);

view.layer.renderInContext(UIGraphicsGetCurrentContext()!)
let screenshot = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

UIImageWriteToSavedPhotosAlbum(screenshot, nil, nil, nil)

我也从这里尝试了snapshotViewAfterScreenUpdates(true),但我不知道如何实现它。我在视图下方有一个collectionView,在视图顶部有一个按钮(两者都不在视图中)。第一个代码使用按钮、collectionView 和子视图捕获所有内容。第二个代码捕获没有子视图的视图。我错过了什么?

【问题讨论】:

  • 您要捕获的所有子视图都在屏幕上可见?
  • 是的,他们是。我想我会在屏幕截图中隐藏我不想要的视图,然后再放回去。

标签: ios swift uiview calayer screen-capture


【解决方案1】:

这对我有用,

func screenShotMethod() {
    //Create the UIImage
    UIGraphicsBeginImageContext(faceTrackerContainerView.frame.size)
    faceTrackerContainerView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    //Save it to the camera roll
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}

Ref

【讨论】:

  • 嗨。谢谢你。这也是我获取代码的地方,它捕获了我屏幕上的所有内容。我只是想用它的子视图捕获一个视图。
  • 尝试从上面的代码中将view 更改为self.faceTrackerContainerView
  • 我试过了,但是视图下没有 renderInContext 方法。
【解决方案2】:
extension UIView {
    func asImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in
            layer.render(in: rendererContext.cgContext)
        }
    }
}

它从 UIView 生成 UIImage。然后你可以使用 UIImageView(image:) 方法使用该图像

【讨论】:

    【解决方案3】:

    为什么不直接打电话给snapshotView(afterScreenUpdates:)

    【讨论】:

    • 感谢您的代码。我对此很陌生。您介意告诉我需要更改/纠正哪些部分吗?
    • @Vinz:我猜提到的方法将返回 UIView 并渲染捕获的视图,而不是直接 UIImage - 你想存储在 PhotosAlbum 中
    • 我尝试使用它,但无法让它工作。在我的一次尝试中给了我一个空白。
    【解决方案4】:

    它不是很优雅,但是在截屏之前隐藏视图是可行的。然后,您可以让它们在之后可见。

    view.isHidden = true
    
    //screenshot
    
    view.isHidden = false
    

    【讨论】:

      【解决方案5】:
      1. 将所有子视图(您要包含在屏幕截图中)添加到一个 父视图。

      2. 像这样绘制父视图层次结构:

          let renderer = UIGraphicsImageRenderer(size: mapParentView.bounds.size)
            let image = renderer.image { ctx in
               mapParentView.drawHierarchy(in: mapParentView.bounds, afterScreenUpdates: true)
              }
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多