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).
Configurez votre scénario avec deux boutons et connectez-les à votre contrôleur de vue (voir le code ci-dessous).
Ajoutez une image à vos Assets.xcassets. J'ai appelé le mien "lion".
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)
}
}
Cliquez sur "Partager du texte" pour afficher le résultat à gauche et sur "Partager une image" pour afficher le résultat à droite.
excludedActivityTypes
comme indiqué dans le code ci-dessus.popoverPresentationController?.sourceView
, votre application se bloquera lorsqu'elle sera exécutée sur un iPad.UIDocumentInteractionController
pour cela.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)
}
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)
}
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).
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)
}