web-dev-qa-db-fra.com

Exemple de base pour partager du texte ou une image avec UIActivityViewController dans Swift

J'ai commencé ma recherche en voulant savoir comment partager des applications avec d'autres applications iOS. J'ai découvert que deux manières importantes sont

  • UIActivityViewController
  • UIDocumentInteractionController

Ces méthodes, ainsi que d’autres, sont comparées dans this SO answer .

Souvent, lorsque j'apprends un nouveau concept, j'aime voir un exemple élémentaire pour bien démarrer. Une fois que je dispose d’un élément de base, je peux le modifier plus tard.

Il y a beaucoup de SO questions liées à UIActivityViewController, mais je n'en ai trouvé aucune qui demandait simplement un exemple simple. Comme je viens d'apprendre à faire cela, je vais donner ma propre réponse ci-dessous. N'hésitez pas à en ajouter une meilleure (ou une version Objective-C).

103
Suragch

Exemple de projet UIActivityViewController

Configurez votre scénario avec deux boutons et connectez-les à votre contrôleur de vue (voir le code ci-dessous).

enter image description here

Ajoutez une image à vos Assets.xcassets. J'ai appelé le mien "lion".

enter image description here

Code

import UIKit
class ViewController: UIViewController {

    // share text
    @IBAction func shareTextButton(_ sender: UIButton) {

        // text to share
        let text = "This is some text that I want to share."

        // set up activity view controller
        let textToShare = [ text ]
        let activityViewController = UIActivityViewController(activityItems: textToShare, applicationActivities: nil)
        activityViewController.popoverPresentationController?.sourceView = self.view // so that iPads won't crash

        // exclude some activity types from the list (optional)
        activityViewController.excludedActivityTypes = [ UIActivityType.airDrop, UIActivityType.postToFacebook ]

        // present the view controller
        self.present(activityViewController, animated: true, completion: nil)

    }

    // share image
    @IBAction func shareImageButton(_ sender: UIButton) {

        // image to share
        let image = UIImage(named: "Image")

        // set up activity view controller
        let imageToShare = [ image! ]
        let activityViewController = UIActivityViewController(activityItems: imageToShare, applicationActivities: nil)
        activityViewController.popoverPresentationController?.sourceView = self.view // so that iPads won't crash

        // exclude some activity types from the list (optional)
        activityViewController.excludedActivityTypes = [ UIActivityType.airDrop, UIActivityType.postToFacebook ]

        // present the view controller
        self.present(activityViewController, animated: true, completion: nil)
    }

}

Résultat

Cliquez sur "Partager du texte" pour afficher le résultat à gauche et sur "Partager une image" pour afficher le résultat à droite.

enter image description here

Remarques

  • Je l'ai réessayé avec iOS 11 et Swift 4. Je devais l'exécuter plusieurs fois dans le simulateur avant que cela ne fonctionne, car le délai d'attente était écoulé. C'est peut-être parce que mon ordinateur est lent.
  • Si vous souhaitez masquer certains de ces choix, vous pouvez le faire avec excludedActivityTypes comme indiqué dans le code ci-dessus.
  • Si vous n'incluez pas la ligne popoverPresentationController?.sourceView, votre application se bloquera lorsqu'elle sera exécutée sur un iPad.
  • Cela ne vous permet pas de partager du texte ou des images avec d'autres applications. Vous voulez probablement UIDocumentInteractionController pour cela.

Voir également

248
Suragch

Partager: Texte

@IBAction func shareOnlyText(_ sender: UIButton) {
    let text = "This is the text....."
    let textShare = [ text ]
    let activityViewController = UIActivityViewController(activityItems: textShare , applicationActivities: nil)
    activityViewController.popoverPresentationController?.sourceView = self.view 
    self.present(activityViewController, animated: true, completion: nil)
}
}

Partager: Image

@IBAction func shareOnlyImage(_ sender: UIButton) {
    let image = UIImage(named: "Product")
    let imageShare = [ image! ]
    let activityViewController = UIActivityViewController(activityItems: imageShare , applicationActivities: nil)
    activityViewController.popoverPresentationController?.sourceView = self.view 
    self.present(activityViewController, animated: true, completion: nil)
 }

Partager: Texte - Image - URL

   @IBAction func shareAll(_ sender: UIButton) {
    let text = "This is the text...."
    let image = UIImage(named: "Product")
    let myWebsite = NSURL(string:"https://stackoverflow.com/users/4600136/mr-javed-multani?tab=profile")
    let shareAll= [text , image! , myWebsite]
    let activityViewController = UIActivityViewController(activityItems: shareAll, applicationActivities: nil)
    activityViewController.popoverPresentationController?.sourceView = self.view 
    self.present(activityViewController, animated: true, completion: nil)
   }

enter image description here

52
Mr.Javed Multani

J'ai trouvé que cela fonctionne parfaitement si vous voulez partager tout l'écran.

@IBAction func shareButton(_ sender: Any) {

    let bounds = UIScreen.main.bounds
    UIGraphicsBeginImageContextWithOptions(bounds.size, true, 0.0)
    self.view.drawHierarchy(in: bounds, afterScreenUpdates: false)
    let img = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    let activityViewController = UIActivityViewController(activityItems: [img!], applicationActivities: nil)
    activityViewController.popoverPresentationController?.sourceView = self.view
    self.present(activityViewController, animated: true, completion: nil)
}
7
Diavel Rider

Juste comme note, vous pouvez aussi utiliser ceci pour les iPad:

activityViewController.popoverPresentationController?.sourceView = sender

Le popover apparaît donc de l'expéditeur (le bouton dans ce cas).

5
Adrien Brecheteau

Vous pouvez utiliser les fonctions suivantes que j'ai écrites dans l'une de mes classes d'assistance dans un projet.

il suffit d'appeler

showShareActivity(msg:"message", image: nil, url: nil, sourceRect: nil) 

et cela fonctionnera à la fois pour iPhone et iPad. Si vous transmettez la valeur CGRect d'une vue par sourceRect, une petite flèche apparaîtra également sur l'iPad.

func topViewController()-> UIViewController{
    var topViewController:UIViewController = UIApplication.shared.keyWindow!.rootViewController!

    while ((topViewController.presentedViewController) != nil) {
        topViewController = topViewController.presentedViewController!;
    }

    return topViewController
}

func showShareActivity(msg:String?, image:UIImage?, url:String?, sourceRect:CGRect?){
    var objectsToShare = [AnyObject]()

    if let url = url {
        objectsToShare = [url as AnyObject]
    }

    if let image = image {
        objectsToShare = [image as AnyObject]
    }

    if let msg = msg {
        objectsToShare = [msg as AnyObject]
    }

    let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
    activityVC.modalPresentationStyle = .popover
    activityVC.popoverPresentationController?.sourceView = topViewController().view
    if let sourceRect = sourceRect {
        activityVC.popoverPresentationController?.sourceRect = sourceRect
    }

    topViewController().present(activityVC, animated: true, completion: nil)
}
2
Mahmud Ahsan