Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Screenshot showing up blank - Swift

Hi I am making a game and I have added a share button to the game. I want the user to be able to share a message, URL, and screenshot along side each other in one message.The sharing aspect of it is working fine and everything is showing up except that the screenshot itself is showing up blank. This is the code I am using to take a screenshot:

   let layer = UIApplication.sharedApplication().keyWindow!.layer
    let scale = UIScreen.mainScreen().scale
    UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, scale);

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

    UIImageWriteToSavedPhotosAlbum(screenshot, nil, nil, nil)

    println("screenshot")

Please help me resolve this issue and please be sure to do so in the Swift language. Also I am using SpriteKit Technology if that makes a difference. I am new to coding so please be very clear. Thank you very much!

like image 503
PineApple Juice Apps Avatar asked Apr 25 '15 01:04

PineApple Juice Apps


2 Answers

update: Xcode 8.2.1 • Swift 3.0.2

You need to add the import statement and this extension to your game scene:

import UIKit 

extension UIView {
    var snapshot: UIImage? {
        UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0)
        defer { UIGraphicsEndImageContext() }
        drawHierarchy(in: bounds, afterScreenUpdates: true)
        return UIGraphicsGetImageFromCurrentImageContext()
    }
}

let myImage = view?.snapshot
like image 148
Leo Dabus Avatar answered Oct 07 '22 16:10

Leo Dabus


In WWDC 2015, What's new in UIVisualEffectView, a solution is "glossed over" for capturing a screenshot of a UIVisualEffectView containing a vibrancy label and a blur. The problem that often arises is that Apple's screenshot API tends not to capture the UIVisualEffect, resulting in a screenshot of the view without the visual effect. The solution according to WWDC 2015 involves capturing the snapshot at the window/screen; unfortunately, sample code was not shown. Following is my own implementation:

//create snapshot of the blurView
let window = UIApplication.sharedApplication().delegate!.window!!
//capture the entire window into an image
UIGraphicsBeginImageContextWithOptions(window.bounds.size, false, UIScreen.mainScreen().scale)
window.drawViewHierarchyInRect(window.bounds, afterScreenUpdates: true)
let windowImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
//now position the image x/y away from the top-left corner to get the portion we want
UIGraphicsBeginImageContext(blurView.frame.size)
windowImage.drawAtPoint(CGPoint(x: -blurView.frame.origin.x, y: -blurView.frame.origin.y))
let croppedImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext();
//embed image in an imageView, supports transforms.
let resultImageView = UIImageView(image: croppedImage)

Note: This snapshot code will only work once ViewDidAppear has been called.

like image 35
ObjectiveTC Avatar answered Oct 07 '22 15:10

ObjectiveTC