web-dev-qa-db-ja.com

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、およびサブビューですべてをキャプチャします。 2番目のコードは、サブビューなしでビューをキャプチャします。何が足りないのですか?

9
Vinz

これは私のために働いています、

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)
}

参照

9
Zaid Pathan

snapshotView(afterScreenUpdates:) を呼び出さないのはなぜですか?

3
NRitH
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
Adam Smaka

あまりエレガントではありませんが、スクリーンショットを撮る前にビューを非表示にすることはできます。その後、それらを表示することができます。

view.isHidden = true

//screenshot

view.isHidden = false
1
Tim