如何使用 Swift 将屏幕截图分享到 Facebook?

How share a screenshot to Facebook using Swift?

我需要在我的应用程序的一个视图控制器上有一个 Facebook 分享按钮,这样当用户按下它时,它就会将用户当前屏幕的屏幕截图分享到 Facebook。

我一直在看一些关于如何实现 Facebook 分享按钮的教程,比如这个:https://www.youtube.com/watch?v=774_-cTjnVM

但这些只展示了我如何在 Facebook 上分享消息,我仍然有点困惑如何分享用户当前正在与之交互的整个屏幕。

直接分享到 Facebook 并不难。首先,导入Social框架:

import Social

现在将此添加为按钮的操作:

let screen = UIScreen.mainScreen()

if let window = UIApplication.sharedApplication().keyWindow {
    UIGraphicsBeginImageContextWithOptions(screen.bounds.size, false, 0);
    window.drawViewHierarchyInRect(window.bounds, afterScreenUpdates: false)
    let image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    let composeSheet = SLComposeViewController(forServiceType: SLServiceTypeFacebook)
    composeSheet.setInitialText("Hello, Facebook!")
    composeSheet.addImage(image)

    presentViewController(composeSheet, animated: true, completion: nil)
}

您可能有兴趣知道 UIActivityViewController 允许用户分享到 Facebook 以及其他服务。上面的代码是针对您的确切问题:分享到 Facebook。此代码呈现 整个 可见屏幕;如果需要,您还可以让单独的视图自行呈现。

注意:正如 Duncan C 在下面的评论中指出的那样,此呈现代码不会包含您应用之外的任何内容,例如其他应用或系统控件。

在 iOS8 和更早版本中,曾经有一个私有框架,您可以使用它来捕获整个屏幕。使用该框架会导致您的应用被应用商店拒绝,但至少它有效。

从 iOS 9 开始,API 不再有效

您最多只能捕获应用的浏览量。这不包括状态栏或系统或其他应用程序绘制的其他内容。

一种方法是创建离屏上下文,将要捕获的父视图渲染到离屏上下文中(可能使用 drawViewHierarchyInRect:afterScreenUpdates:,将上下文中的数据加载到 UIImage 中,然后然后关闭上下文。

另一种方法是新的 API,它将捕获视图层次结构的快照。捕获快照的新方法之一是 snapshotViewAfterScreenUpdates。这会创建专门的快照视图。

swift 3

    let screen = UIScreen.main

    if let window = UIApplication.shared.keyWindow {
        UIGraphicsBeginImageContextWithOptions(screen.bounds.size, false, 0);
        window.drawHierarchy(in: window.bounds, afterScreenUpdates: false)
        let image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        let composeSheet = SLComposeViewController(forServiceType: SLServiceTypeFacebook)
        composeSheet?.setInitialText("Hello, Facebook!")
        composeSheet?.add(image)

        present(composeSheet!, animated: true, completion: nil)
    }