ios - swift share button
Ejemplo básico para compartir texto o imagen con UIActivityViewController en Swift (5)
Comencé mi búsqueda queriendo saber cómo podría compartir con otras aplicaciones en iOS. Descubrí que dos formas importantes son
-
UIActivityViewController
-
UIDocumentInteractionController
Estos y otros métodos se comparan en esta respuesta SO .
A menudo, cuando estoy aprendiendo un nuevo concepto, me gusta ver un ejemplo básico para comenzar. Una vez que obtengo una configuración básica, puedo modificarla como más tarde me guste.
Hay muchas preguntas SO relacionadas con
UIActivityViewController
, pero no pude encontrar ninguna que solo pidiera un ejemplo simple.
Como acabo de aprender a hacer esto, proporcionaré mi propia respuesta a continuación.
Siéntase libre de agregar una mejor (o una versión de Objective-C).
Proyecto de ejemplo UIActivityViewController
Configure su guión gráfico con dos botones y conéctelos a su controlador de vista (vea el código a continuación).
Agregue una imagen a sus Assets.xcassets. Yo llamé al mío "león".
Código
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)
}
}
Resultado
Al hacer clic en "Compartir texto" se obtiene el resultado a la izquierda y al hacer clic en "Compartir una imagen" se obtiene el resultado a la derecha.
Notas
- Volví a probar esto con iOS 11 y Swift 4. Tuve que ejecutarlo un par de veces en el simulador antes de que funcionara porque se estaba agotando el tiempo de espera. Esto puede deberse a que mi computadora es lenta.
-
Si desea ocultar algunas de estas opciones, puede hacerlo con
excludedActivityTypes
como se muestra en el código anterior. -
Si no se incluye la línea
popoverPresentationController?.sourceView
, la aplicación se bloqueará cuando se ejecute en un iPad. -
Esto no le permite compartir texto o imágenes a otras aplicaciones.
Probablemente desee
UIDocumentInteractionController
para eso.
Ver también
- Agregue compartir a su aplicación Swift a través de UIActivityViewController
- Controlador de vista UIActivity de NSHipster
-
Documentación de
UIActivityViewController
- Compartir documentación de extensión
-
comparación con
UIDocumentInteractionController
Encontré que esto funciona perfectamente si quieres compartir toda la pantalla.
@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)
}
Puede usar las siguientes funciones que escribí en una de mis clases de ayuda en un proyecto.
solo llama
showShareActivity(msg:"message", image: nil, url: nil, sourceRect: nil)
y funcionará tanto para iPhone como para iPad. Si pasa el valor CGRect de cualquier vista por sourceRect, también mostrará una pequeña flecha en el 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)
}
Solo como nota, también puede usar esto para iPads:
activityViewController.popoverPresentationController?.sourceView = sender
Entonces el popover aparece del remitente (el botón en ese caso).
Compartir: texto
@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)
}
}
Compartir: Imagen
@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)
}
Compartir: Texto - Imagen - URL
@IBAction func shareAll(_ sender: UIButton) {
let text = "This is the text...."
let image = UIImage(named: "Product")
let myWebsite = NSURL(string:"https://.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)
}