Home » Píldoras de código » Píldoras de código, UIActivityViewController en iOS 9
Pildoras de Código UIActivityViewController

Píldoras de código, UIActivityViewController en iOS 9

iPad and iPhone Activity Controller

La vista de actividad es uno de los elementos que nos acompañan en muchas apps. Es ese diálogo del sistema que se presenta con los diferentes servicios de cada app para compartir contenido. Cuando queremos enviar algo a Facebook, a Twitter, a Evernote, Slack… de hecho, cualquier app puede crear sus propios servicios e incorporarlos a este para que el usuario (si así lo desea) los configure y elija.

Las normas para este tipo de vista son simples: primero elegimos qué contenido queremos enviar. Luego, en caso de ser un iPhone la vista ha de ser modal (dejará la app en segundo plano y solo esta vista responderá a la interacción). Pero en caso de ser un iPad tenemos que mostrarla en modo popover (como una ventana flotante que parte de un origen, suspendida sobre la interfaz).

Para crearla en nuestra app, solo tenemos que usar la clase UIActivityViewController. Vamos a suponer que queremos enviar una imagen, para lo cual tendríamos un objeto ya creado llamado imagen de la clase UIImage.

Este ejemplo crea una instancia del objeto UIActivityViewController que permite instanciar el diálogo de compartir y le envía un parámetro imagen que será un objeto de tipo UIImage que queremos compartir (dentro de un array pues podemos enviar varios elementos).

Tocamos la propiedad excludedActivityTypes y le enviamos un array de tipos UIActivity que suponen aquellos elementos que no queremos que se muestren como opción a compartir (en este caso, añadir a la lista de lectura rápida, pero podemos hacer uso de otras como que se descarte Facebook o guardar en el carrete). Luego creamos un manejador de completado en forma de closure que asignamos a la propiedad completionWithItemsHandler. El closure ha de tener los parámetros indicados.

Acto seguido, preguntamos a la propiedad de sistema UIDevice.currentDevice().userInterfaceIdiom su valor: si es .Pad estamos en un iPad y si es .Phone es un iPhone o un iPod Touch. En caso de serlo, tenemos que añadir algunas cosas más a nuestro objeto UIActivityViewController.

Lo primero, en caso de ser un iPad, es configurar la propiedad modalPresentationStyle en .Popover que es cómo se mostrará la ventana flotante. Luego, necesitamos indicarle al sistema dónde ha de colocar la flecha de la ventana flotante para que el usuario vea contextualizado de dónde ha surgido su llamada. Para ello, tenemos un objeto botón que ya tendremos creado, de tipo UIButton, que ha hecho que se active nuestra opción de compartir, así que pasamos como referencia el cuadro que lo contiene (su propiedad frame). Por último, le decimos al popover que la vista fuente de la que partirá es nuestra propia clase (o sea self).

Tras esto, presentamos el controlador de la vista creada en nuestra propia vista invocando presentViewController, pasándole el objeto UIActivityViewController y el parámetro animated a true para que salga animada.

Nada más: solo notar la variable paused. La hemos puesto como ejemplo de una situación de pausa que hiciéramos en nuestra app (esta variable sería el semáforo que indicaría este estado) y que en el manejador de completado bajamos para restaurar el estado de nuestra app.

En el caso de trabajar en Sprite Kit, haciendo un juego, tendríamos que cambiar la propiedad del popover sourceView a self.view y la llamada a presentViewController sería algo más larga:

Espero que os sea útil esta píldora y nos vemos en la próxima. Ya sabéis, cualquier duda o problema, estamos a vuestra disposición. Probad, experimentad y Good Apple Coding.

Probado en Xcode 7.2 / Swift 2.1 / iOS 9.2.

Acerca de Julio César Fernández

Analista, consultor y periodista tecnológico, desarrollador, empresario, productor audiovisual, actor de doblaje e ingeniero de vídeo y audio.

Otras recomendaciones

Píldoras UIImage

Borrar un color en un UIImage y hacerlo canal alfa

Función que usa CGImageCreateWithMaskColors, para crear una imagen nueva a partir de una existente, borrando un color y haciéndolo canal alfa transparente.