Ejemplo básico para el intercambio de texto o una imagen con UIActivityViewController en Swift

Comencé mi búsqueda por querer saber cómo podría compartir con otras aplicaciones en iOS. Descubrí que dos maneras importantes son

  • UIActivityViewController
  • UIDocumentInteractionController

Estos y otros métodos se comparan en este MODO de respuesta.

A menudo cuando estoy aprendiendo un nuevo concepto me gustaría ver un ejemplo básico para ayudarme a comenzar. Una vez que tengo algo básico que puedo modificarlo cómo me gusta más tarde.

Hay muchas preguntas relacionadas con la UIActivityViewController, pero no pude encontrar ninguno de los que estaban preguntando por un simple ejemplo. Como yo aprendí a hacer esto, voy a dar mi propia respuesta a continuación. Siéntase libre de agregar una mejor (o de un Objetivo-C versión).

InformationsquelleAutor Suragch | 2016-03-11

6 Kommentare

  1. 261

    UIActivityViewController Proyecto De Ejemplo

    Configurar tu guión gráfico con dos botones y conectarlos a la vista controlador (véase el código de abajo).

    Ejemplo básico para el intercambio de texto o una imagen con UIActivityViewController en Swift

    Añadir una imagen a sus Activos.xcassets. Me llama la mina de «león».

    Ejemplo básico para el intercambio de texto o una imagen con UIActivityViewController en Swift

    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

    Clic en «Compartir algunas de texto» da resultado a la izquierda y hacer clic en «Compartir una imagen» da el resultado a la derecha.

    Ejemplo básico para el intercambio de texto o una imagen con UIActivityViewController en Swift

    Notas

    • He vuelto a probar esto con iOS 11 y Swift 4. Tuve que correr un par de veces en el simulador antes funcionaba porque era tiempo de espera. Esto puede ser debido a que mi pc es lenta.
    • Si desea ocultar algunas de estas opciones, usted puede hacer eso con excludedActivityTypes como se muestra en el código anterior.
    • No incluyendo el popoverPresentationController?.sourceView línea hará que su aplicación se bloquee cuando se ejecuta en un iPad.
    • Esto no permite compartir texto o imágenes a otras aplicaciones. Usted probablemente querrá UIDocumentInteractionController para que.

    Ver también

    • Por qué algunos ejemplos muestran la matriz de 1 elemento, y algunos programas de la 2? Suponiendo que compartir una imagen.
    • Suragch: Hola quiero compartir un referall código en el texto y la necesidad de que el código sea copiada en haga clic o toque como sucede cuando enviamos un número.
  2. 65

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

    Ejemplo básico para el intercambio de texto o una imagen con UIActivityViewController en Swift

    • hey no su trabajo. En FB único vínculo es compartir la imagen y el texto.
    • Es la aplicación de mensajes configurados correctamente con una nube de cuenta?
    • De acuerdo a la política de actualización de FB, una URL o una imagen puede ser compartida. el texto no puede
    • medium.com/@javedmultani16/…
  3. 10

    He encontrado que esto funcione a la perfección si desea 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)
    }
  4. 7

    Sólo como una nota también puede utilizar esto para iPads:

    activityViewController.popoverPresentationController?.sourceView = sender

    Por lo que la ventana emergente cop del remitente (el botón en ese caso).

    • activityViewController.popoverPresentationController?.sourceView = remitente? UIView -trabajó para mí. 🙂 gracias
  5. 2

    Usted puede utilizar las siguientes funciones que escribí en uno de mis ayudante de clase en un proyecto.

    acaba de llamar

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

    y funcionará tanto para iPhone como para iPad. Si pasa cualquier vista del CGRect valor por sourceRect también se muestra 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)
    }
  6. 1

    He utilizado la aplicación anterior y recién ahora me di cuenta de que no funciona en el iPad con iOS 13.
    He tenido que añadir estas líneas antes del presente() la llamada con el fin de hacer que funcione

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

    Que funciona para mí

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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea