Esempio di base per la condivisione di testo o immagine con UIActivityViewController in Swift


132

Ho iniziato la mia ricerca volendo sapere come poter condividere con altre app in iOS. Ho scoperto che ci sono due modi importanti

  • UIActivityViewController
  • UIDocumentInteractionController

Questi e altri metodi vengono confrontati in questa risposta SO .

Spesso quando sto imparando un nuovo concetto, mi piace vedere un esempio di base per iniziare. Una volta che ho ottenuto qualcosa di base, posso modificarlo come mi piace in seguito.

Ci sono molte domande relative a SO UIActivityViewController, ma non riuscivo a trovarne nessuna che chiedesse un semplice esempio. Da quando ho appena imparato a farlo, fornirò la mia risposta di seguito. Sentiti libero di aggiungerne uno migliore (o una versione di Objective-C).

Risposte:


279

Progetto di esempio UIActivityViewController

Configura lo storyboard con due pulsanti e collegali al controller della vista (vedi codice sotto).

inserisci qui la descrizione dell'immagine

Aggiungi un'immagine ai tuoi Assets.xcassets. Ho chiamato il mio "leone".

inserisci qui la descrizione dell'immagine

Codice

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)
    }

}

Risultato

Facendo clic su "Condividi del testo" si ottiene il risultato a sinistra e facendo clic su "Condividi un'immagine" si ottiene il risultato a destra.

inserisci qui la descrizione dell'immagine

Appunti

  • Ho eseguito nuovamente il test con iOS 11 e Swift 4. Ho dovuto eseguirlo un paio di volte nel simulatore prima che funzionasse perché stava scadendo. Ciò può essere dovuto al fatto che il mio computer è lento.
  • Se desideri nascondere alcune di queste scelte, puoi farlo excludedActivityTypescome mostrato nel codice sopra.
  • Se non includi la popoverPresentationController?.sourceViewlinea, l'app si arresterà in modo anomalo quando viene eseguita su un iPad.
  • Ciò non ti consente di condividere testo o immagini con altre app. Probabilmente lo vorrai UIDocumentInteractionController.

Guarda anche


1
Perché alcuni esempi mostrano una matrice di 1 elemento e alcuni mostrano 2? Supponendo di condividere un'immagine.
Lim Thye Chean,

@ Suragch: Ciao, voglio condividere un codice di riferimento nel testo e ho bisogno di copiarlo facendo clic o toccandolo come succede quando inviamo un numero.
Ishika,

74

Condividi: testo

@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)
}
}

Condividi: Immagine

@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)
 }

Condividi: Testo - Immagine - 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)
   }

inserisci qui la descrizione dell'immagine


4
hey non funziona. In FB solo il collegamento è condividere non immagine e testo.
Ekta Padaliya,

@ScriptKitty. L'app Messaggi è configurata correttamente con un account i cloud?
Awais Fayyaz,

1
@EktaPadaliya. Secondo la politica di aggiornamento FB, è possibile condividere un URL o un'immagine. il testo non può
Awais Fayyaz,


2
@ L'immagine Mr.JavedMultani non è condivisa in whatsapp
NickCoder il

10

Ho scoperto che funziona perfettamente se vuoi condividere l'intero schermo.

@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)
}

9

Proprio come una nota puoi anche usare questo per iPad:

activityViewController.popoverPresentationController?.sourceView = sender

Quindi il popover viene visualizzato dal mittente (il pulsante in quel caso).


activityViewController.popoverPresentationController? .sourceView = mittente come? UIView ha funzionato per me. :) grazie
Brian,

La casella Condividi non era disponibile per iPad. Ciò ha risolto i problemi con l'iPad che avevo riscontrato!
Asp Upload

3

Puoi usare le seguenti funzioni che ho scritto in una delle mie lezioni di aiuto in un progetto.

chiama soltanto

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

e funzionerà sia per iPhone che per iPad. Se passi il valore CGRect di una vista per sourceRect, mostrerà anche una piccola freccia in 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)
}

Funziona perfettamente! 👍🏻
Ravindra_Bhati

Invece della serie di ifdichiarazioni, puoi scrivere [url, image, msg].compactMap({ $0 }).
Avi

3

Ho usato l'implementazione sopra e proprio ora sono venuto a sapere che non funziona su iPad con iOS 13. Ho dovuto aggiungere queste linee prima della chiamata present () per farlo funzionare

//avoiding to crash on iPad
if let popoverController = activityViewController.popoverPresentationController {
     popoverController.sourceRect = CGRect(x: UIScreen.main.bounds.width / 2, y: UIScreen.main.bounds.height / 2, width: 0, height: 0)
     popoverController.sourceView = self.view
     popoverController.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
}

Funziona così per me

func shareData(_ dataToShare: [Any]){

        let activityViewController = UIActivityViewController(activityItems: dataToShare, applicationActivities: nil)

        //exclude some activity types from the list (optional)
        //activityViewController.excludedActivityTypes = [
            //UIActivity.ActivityType.postToFacebook
        //]

        //avoiding to crash on iPad
        if let popoverController = activityViewController.popoverPresentationController {
            popoverController.sourceRect = CGRect(x: UIScreen.main.bounds.width / 2, y: UIScreen.main.bounds.height / 2, width: 0, height: 0)
            popoverController.sourceView = self.view
            popoverController.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
        }

        self.present(activityViewController, animated: true, completion: nil)
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.