Ios 从UI屏幕拍摄快照

Ios 从UI屏幕拍摄快照,ios,swift,Ios,Swift,我想从视图(包括状态栏)中拍摄快照 下面的代码在模拟器中工作,但在物理设备上不工作 extension UIScreen { class func screenshot() -> UIImage { let view = main.snapshotView(afterScreenUpdates: false) UIGraphicsBeginImageContext(view.bounds.size) view.drawHierar

我想从视图(包括状态栏)中拍摄快照

下面的代码在模拟器中工作,但在物理设备上不工作

extension UIScreen {

    class func screenshot() -> UIImage {
        let view = main.snapshotView(afterScreenUpdates: false)

        UIGraphicsBeginImageContext(view.bounds.size)
        view.drawHierarchy(in: view, afterScreenUpdates: true)

        let screenshot = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return screenshot!
    }
}

要解决您的问题,您可以使用此功能:

func takeScreenshot() -> 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()

    return screenshotImage
}

我刚刚测试了它,它可以在物理设备上工作。

创建一个扩展,如:

extension UIScreen {

    class func screenshot() -> UIImage {
        let view = main.snapshotView(afterScreenUpdates: false)

        UIGraphicsBeginImageContext(view.bounds.size)
        view.drawHierarchy(in: view, afterScreenUpdates: true)

        let screenshot = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return screenshot!
    }
}
extension UIApplication {

    func getViewScreenShot(vc: UIViewController) -> UIImage? {

        let scale = UIScreen.main.scale
        let bounds = vc.view.bounds
        UIGraphicsBeginImageContextWithOptions(bounds.size, false, scale)
        if UIGraphicsGetCurrentContext() != nil {
            vc.view.drawHierarchy(in: bounds, afterScreenUpdates: true)
            let screenshot = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return screenshot!
        }
        return nil
    }
}
把它叫做:

weak var weakSelf = self
let screenShotImage: UIImage = UIApplication.shared.getViewScreenShot(vc: weakSelf!)

此代码未编译,是否要调用
view.drawHierarchy(in:view.frame,afterScreenUpdate:true)