【问题标题】:ScreenShot taken with UIGraphicsGetImageFromCurrentImageContext is blank when using Cocos2D/SpriteBuilder使用 Cocos2D/SpriteBuilder 时,使用 UIGraphicsGetImageFromCurrentImageContext 截取的屏幕截图为空白
【发布时间】:2019-04-23 19:35:35
【问题描述】:

我无法使用按钮和以下代码截取应用程序的屏幕截图:

func takeAScreenshot() {
    var screenshotImage :UIImage?
    let layer = UIApplication.shared.keyWindow!.layer
    let scale = UIScreen.main.scale
    UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, scale);
    let context = UIGraphicsGetCurrentContext()
    layer.render(in:context!)
    screenshotImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    if let image = screenshotImage, true {
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
    }
}

每个屏幕截图都是空白的。 我尝试了几个在其他 stackOverflow Questions 上找到的代码示例,但每次都是空白或黑色屏幕截图。

【问题讨论】:

标签: swift screenshot spritebuilder


【解决方案1】:
open func takeScreenshot(_ shouldSave: Bool = true) -> UIImage? {
        var screenshotImage :UIImage?
        let layer = UIApplication.shared.keyWindow!.layer
        let scale = UIScreen.main.scale
        UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, scale);
        guard let context = UIGraphicsGetCurrentContext() else {return nil}
        layer.render(in:context)
        screenshotImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        if let image = screenshotImage, shouldSave {
            UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
        }

        return screenshotImage


    }

【讨论】:

  • 请在代码中添加解释(并避免删除您的帖子:最好改为edit。)
  • UIKit 代码永远无法截取 Cocos2D-SpriteBuilder/OpenGL 上下文。
【解决方案2】:

使用这些功能

import UIKit
import AudioToolbox

/// Takes the screenshot of the screen and returns the corresponding image
///
/// - Parameter shouldSave: Boolean flag asking if the image needs to be saved to user's photo library. Default set to 'true'
/// - Returns: (Optional)image captured as a screenshot
func takeScreenshot(_ shouldSave: Bool = true) -> UIImage? {
    var screenshotImage :UIImage?
    let layer = UIApplication.shared.keyWindow!.layer
    let scale = UIScreen.main.scale
    UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, scale);
    guard let context = UIGraphicsGetCurrentContext() else {return nil}
    layer.render(in:context)
    screenshotImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    if let image = screenshotImage, shouldSave {
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
        AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
    }
    return screenshotImage
}

//Take Screenshot
func takeScreenShot(viewController: UIViewController) {
     let image = self.takeScreenshot(true)
     var imagesToShare = [AnyObject]()
     imagesToShare.append(image!)

     let activityViewController = UIActivityViewController(activityItems: imagesToShare , applicationActivities: nil)
     activityViewController.popoverPresentationController?.sourceView = viewController.view
     viewController.present(activityViewController, animated: true, completion: nil)
}

【讨论】: