J'essaie de partager une image avec du text via UIActivityViewController
. Si je fais ceci:
let activityVC = UIActivityViewController(activityItems: [text, image], applicationActivities: nil) self.presentViewController(activityVC, animated: true, completion: nil)
Tout fonctionne bien. Le problème est que je veux seulement partager l'image avec certains types d'activités. c'est-à-dire quand un user partage avec Facebook je ne veux pas d'image, pour tout ce que je fais. Mon problème est que cette méthode stupide n'est jamais appelée:
optional func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: Ssortingng?, suggestedSize size: CGSize) -> UIImage?
Ce qui devrait être défini dans le protocole UIActivityItemSource
. Y a-t-il du travail à faire?
Donc, je crois avoir fait quelques progrès ici. Si nous transmettons plusieurs valeurs de self
lors de l'instanciation de UIActivityViewController
vous pouvez renvoyer plusieurs valeurs dans la méthode déléguée itemForActivityType
. Donc si je fais ceci:
let activityVC = UIActivityViewController(activityItems: [self, self], applicationActivities: nil)
Je peux returnner différentes valeurs comme ceci:
func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: Ssortingng) -> AnyObject? { if activityType == UIActivityTypePostToFacebook { return ["hello", "world"] } else { return ["goodnight", "moon"] } }
Cependant, il semble que vous ne pouvez returnner que deux valeurs du même type.
Ma nouvelle question est maintenant, comment pourrais-je returnner à la fois une image et un text ?? La chasse continue …
Pour partager deux sets de contenu différents, vous devez créer deux sources d'articles différentes
nous pouvons définir différents contenus textuels pour différents types d'activités. Ajouter la class MySsortingngItemSource à votre viewcontroller
SourceOne:
class MySsortingngItemSource: NSObject, UIActivityItemSource { @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject { return "" } @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: Ssortingng) -> AnyObject? { //You can pass different text for for diffrent activity type if activityType == UIActivityTypePostToFacebook { return "Ssortingng for facebook" }else{ return "Ssortingng for Other" } } }
Notre exigence est d'append une image à tout type d'activité sauf FB , pour cela, ajoutez la class MyImageItemSource dans votre VC.
SourceTwo:
class MyImageItemSource: NSObject, UIActivityItemSource { @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject { return "" } @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: Ssortingng) -> AnyObject? { //This one allows us to share image ecxept UIActivityTypePostToFacebook if activityType == UIActivityTypePostToFacebook { return nil } let Image: UIImage = UIImage(data: NSData(contentsOfURL: NSURL(ssortingng: "https://pbs.twimg.com/profile_images/604644048/sign051.gif")!)!)! return Image } }
Maintenant nous sums prêts à configurer UIActivityViewController, c'est parti
@IBAction func Test(sender: AnyObject) { let activityVC = UIActivityViewController(activityItems: [MySsortingngItemSource(),MyImageItemSource()] as [AnyObject], applicationActivities: nil) //Instead of using rootviewcontroller go with your own way. if let window = (UIApplication.sharedApplication().delegate as? AppDelegate)?.window { window.rootViewController?.presentViewController(activityVC, animated: true, completion: nil) } }
Dialogue partagé TWITTER: Contient une image et un text donné
Dialogue de partage FB: contient uniquement le text donné