2016-10-22 97 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的圖像(圖像:)方法