arc4Random
arc4Random

Reputation: 101

Swift: Take a screenshot of the viewController and share it on Facebook

I created the following function to share a post on Facebook:

@IBAction func socialShare(_ sender: Any){
    //Alert
    let alert = UIAlertController(title: "Share", message: "First share!", preferredStyle: .actionSheet)

    //First action
    let actionOne = UIAlertAction(title: "Share on Facebook", style: .default) { (action) in

        //Checking if user is connected to Facebook
        if SLComposeViewController.isAvailable(forServiceType: SLServiceTypeFacebook)
        {
            let post = SLComposeViewController(forServiceType: SLServiceTypeFacebook)!
            post.setInitialText("First")
            post.add(UIImage(named: "Mylogo.png"))
            self.present(post, animated: true, completion: nil)
        } else {self.showAlert(service: "Facebook")}
    }

    let actionThree = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
    //Add action to action sheet
    alert.addAction(actionOne)
    alert.addAction(actionThree)

    //Present alert
    self.present(alert, animated: true, completion: nil)    
}

func showAlert(service:String){
    let alert = UIAlertController(title: "Error", message: "You are not connected to \(service)", preferredStyle: .alert)
    let action = UIAlertAction(title: "Dismiss", style: .cancel, handler: nil)

    alert.addAction(action)
    present(alert, animated: true, completion: nil)
}

But what I really want to do is to share an image and this image must be a screenshot of the viewController in which the user taps the share button. Is this possible? If so, how?

Update:

For the screenshot I have found a function like this:

func screenShotMethod() {
    //Create the UIImage
    UIGraphicsBeginImageContext(view.frame.size)
    view.layer.renderInContext(UIGraphicsGetCurrentContext())
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    //Save it to the camera roll
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}

But I don't know how to implement it in my code.

Upvotes: 0

Views: 1470

Answers (1)

Alexkater
Alexkater

Reputation: 76

to do that you can do something like this

func screenShotMethod() -> UIImage? {
    //Create the UIImage
    UIGraphicsBeginImageContext(view.frame.size)
    view.layer.render(in: UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
}

And add it to:

    let post = SLComposeViewController(forServiceType: SLServiceTypeFacebook)!
    post.setInitialText("First")
    post.add(screenShotMethod())
    self.present(post, animated: true, completion: nil)

Upvotes: 1

Related Questions