2016-10-22 103 views
4

我想捕获一个视图及其子视图。我正在使用此代码捕获屏幕:Swift:如何保存视图的子视图截图?

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和子视图捕获所有内容。第二个代码捕获没有子视图的视图。请让我知道我错过了什么,或者我还能提供什么。谢谢!

+0

想要捕获的所有子视图都可以在屏幕上看到吗? – BaSha

+0

是的,他们是。我想我只是隐藏我不想在屏幕截图中看到的视图,然后重新放入。 – Vinz

回答

1

为什么不直接拨打snapshotView(afterScreenUpdates:)

+0

感谢您的代码。我很新。你介意告诉我哪些部分我需要改变/改正? – Vinz

+0

@Vinz:我想提到的方法将返回UIView与渲染捕获的视图,而不是直接UIImage - 你想存储在PhotosAlbum – BaSha

+0

我试过使用它,但无法让它工作。在我的一次尝试中给了我一个空白。 – Vinz

7

这是为我工作,

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

+0

嗨。谢谢你。这也是我获得代码的地方,它捕获我屏幕上的所有内容。我只是想用它的子视图捕捉一个视图。 – Vinz

+0

尝试使用'self.faceTrackerContainerView'从上面的代码更改'view'。 –

+0

我试过,但意见down't有renderInContext方法虽然。 – Vinz

0

这是不是很优雅,但截图之前,隐藏的意见采取的作品。之后你可以使它们可见。

view.isHidden = true 

//screenshot 

view.isHidden = false 
1
extension UIView { 
    func asImage() -> UIImage { 
     let renderer = UIGraphicsImageRenderer(bounds: bounds) 
     return renderer.image { rendererContext in 
      layer.render(in: rendererContext.cgContext) 
     } 
    } 
} 

它使从一个UIView一个UIImage的。然后你可以使用UIImageView的图像(图像:)方法