2016-03-11 23 views
52

Ho iniziato la mia ricerca volendo sapere come condividere con altre app in iOS. Ho scoperto che due modi importanti sonoEsempio di base per la condivisione di testo o immagine con UIActivityViewController in Swift

  • UIActivityViewController
  • UIDocumentInteractionController

Questi ed altri metodi sono confrontati in this SO answer.

Spesso quando sto imparando un nuovo concetto mi piace vedere un esempio di base per iniziare. Una volta ottenuto qualcosa di base, posso modificarlo come mi piace più tardi.

Ci sono molte domande SO relative a UIActivityViewController, ma non sono riuscito a trovare nessuno che chiedesse semplicemente un esempio. Da quando ho appena imparato come farlo, fornirò la mia risposta qui sotto. Sentiti libero di aggiungerne uno migliore (o una versione Objective-C).

+0

https://iosdevcenters.blogspot.com/2017/08/how-to-share-content-with.html –

risposta

163

UIActivityViewController Esempio Progetto

Impostare lo storyboard con due pulsanti e li collegare al controller della vista (vedi codice qui sotto).

enter image description here

aggiungere un'immagine al tuo Assets.xcassets. Ho chiamato il mio "leone".

enter image description here

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 la parte del testo" dà seguito a sinistra e facendo clic su "Condividi un'immagine" dà il risultato sulla destra.

enter image description here

Note

  • ho rianalizzato questo con iOS 11 e Swift 4. Ho dovuto correre un paio di volte nel simulatore prima ha funzionato perché è stato timeout. Ciò potrebbe essere dovuto al fatto che il mio computer è lento.
  • Se si desidera nascondere alcune di queste scelte, è possibile farlo con excludedActivityTypes come mostrato nel codice sopra.
  • La mancata inclusione della linea popoverPresentationController?.sourceView provoca l'arresto anomalo della tua app quando viene eseguito su un iPad.
  • Ciò non consente di condividere testo o immagini con altre app. Probabilmente vuoi lo UIDocumentInteractionController per quello.

Vedi anche

+1

Perché alcuni esempi mostrano serie di 1 punto, e alcuni spettacoli 2? Supponendo di condividere un'immagine. –

5

Proprio come una nota è anche possibile utilizzare questo per iPad:

activityViewController.popoverPresentationController?.sourceView = sender 

Così i pops popover dal mittente (il pulsante in questo caso).

+0

activityViewController.popoverPresentationController? .sourceView = sender as? UIView - lavorato per me. :) Grazie – Brian

3

Ho trovato che funziona in modo impeccabile se si desidera 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) 
} 
1

È possibile utilizzare le seguenti funzioni che ho scritto in una delle mie classi di supporto in un progetto.

basta chiamare

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

e si lavorerà per iPhone e iPad. Se si passa il valore CGRect di una vista da parte di sourceRect, verrà visualizzata 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) 
} 
0

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

enter image description here