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
.
paused = true let activity = UIActivityViewController(activityItems: [imagen], applicationActivities: nil) activity.excludedActivityTypes = [UIActivityTypeAddToReadingList] activity.completionWithItemsHandler = { [unowned self] (activityType, success, items, error) -> Void in self.paused = false } if UIDevice.currentDevice().userInterfaceIdiom == .Pad { activity.modalPresentationStyle = .Popover activity.popoverPresentationController?.sourceRect = boton.frame activity.popoverPresentationController?.sourceView = self } self.presentViewController(activity, animated: true, completion: nil)
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:
self.view?.window?.rootViewController?.presentViewController(activity, animated: true, completion: nil)
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.