Ulzurrun de Asanza i Sàez

Tag: Cocoa Touch

Hasta luego y gracias por el pescado

Tal día como hoy, hace dos años, decidí transformar lo que entonces era un proyecto de portal de videojuegos en un blog sobre informática, y tras estos dos años escribiendo prácticamente a diario me ha quedado claro que no era tan mala idea, y que era la mejor forma de continuar con Sumolari.com. Estas últimas semanas he vuelto a pensar sobre el futuro de Sumolari.com y me he dado cuenta de que no puedo mantener el ritmo que he llevado durante estos dos últimos años (94 artículos cada 100 días son muchos artículos).

El futuro del blog

Si en un mes como agosto, que tenía todo el día libre, tan sólo he llegado a publicar 20 artículos, no quiero ni imaginarme los pocos que habría publicado en un mes como junio, que además de tener los exámenes finales, este año para mí tendría un nuevo reto más: la Prueba de Acceso a la Universidad. Sin lugar a dudas, habría publicado muy pocos artículos y de una calidad muy pobre (sí, más aún que los que publico ahora mismo). Seguramente el principal motivo por el que cada vez escribo más artículos es que el tiempo libre del que dispongo (que cada vez es menos) tengo que compartirlo con cada proyecto en el que trabajo, lanzando nuevas versiones de mis proyectos según va siendo necesario, y lanzando proyectos nuevos de vez en cuando.

Así que he decidido darle un nuevo enfoque a Sumolari.com. Si en un principio el blog fue el centro de la página y mis proyectos eran algo accesorio, ahora será al contrario: mis proyectos pasarán a ser el centro de Sumolari.com y el blog estará en segundo plano. Dejaré de publicar noticias en el blog, y tan sólo publicaré tutoriales y reseñas de cosas que me parezcan interesantes. Es decir, a partir de ahora cabe esperar muchos menos artículos al mes, pero más útiles y menos repetitivos.

De todos modos, el blog tampoco ha sido un gran éxito dentro de lo que cabe. Mi principal plugin para WordPress, WP Carousel consiguió superar ayer las 16.000 descargas, superando a razón de casi 16:1 a los comentarios del blog. Creo que es mucho mejor que dedique el tiempo que tengo a proyectos como WP Carousel y publique de vez en cuando tutoriales útiles. Curiosamente, los artículos más comentados no son ni de lejos los que he publicando más recientemente, como por ejemplo el tutorial de cómo crear un carrusel con jQuery o  el truco para evitar conflictos entre jQuery y Mootools o la explicación de cómo crear varias sidebars en WordPress o la forma de validar formularios con jQuery, ninguno de ellos publicado en 2010.

La calidad del blog, definitivamente, ha ido decayendo durante estos 2 años, y me parece que en esta ocasión es mejor calidad que cantidad, de modo que, en resumen, el blog pasará a segundo plano, los proyectos serán el centro de Sumolari.com y publicaré menos artículos pero de más calidad y centrados en la temática que quise tratar originalmente en el blog: tutoriales de informática.

Presentando… Chuck Facts

Y hasta aquí llega la parte “triste” del artículo, ahora toca presentar el proyecto en el que he trabajo durante este verano. Creo que lo he dicho en varias ocasiones, pero desde junio del año pasado, cuando me pasé a Mac, he estado intentando aprender a programar para Mac y para el iPhone / iPod Touch (y de paso iPad, aunque cuando comencé aún no existía). Ese verano me aventuré a comprar un libro de programación para el iPhone para torpes. Lamentablemente acabó el verano, septiembre y parte de octubre antes de que llegase a casa, así que no pude aprender nada.

A lo largo de este año he estado recopilando libros para aprender programación en Objective-C y orientada al iPhone / iPod Touch, y finalmente, tras dos meses veraniegos de dedicar todo el día a leer y estudiar diversos libros de programación, he aprendido lo básico para crear una aplicación para el iPhone (aún me quedan muchos libros muy interesantes por leer, pero me temo que se quedarán para el verano que viene). Tras rescatar la lista de proyectos que me gustaría llevar a cabo para el iPhone / iPod Touch y revisar los que tenía conocimientos suficientes para llevar a cabo, decidí comenzar a desarrollar mi primera aplicación y la primera de la App Store sobre Hechos de Chuck Norris.

Ya está terminada y desde ayer enviada para que la revisen y la aprueben (espero) o no en la App Store. No sé si la aprobarán finalmente o no, así que voy a explicar en qué consiste la aplicación en este artículo, por si finalmente resulta rechazada. Se trata de una aplicación que permite ver hechos de Chuck Norris almacenados en el servidor de Sumolari.com. Los hechos se encuentran organizados por categorías y pueden localizarse tanto hechos individuales como categorías desde el buscador de la aplicación (hay un buscador en cada lista de hechos de Chuck Norris). La cosa no acaba ahí ya que la gracia reside en que todos los usuarios pueden enviar sus propios hechos de Chuck Norris, que aparecerán en la aplicación tras mi aprobación (para evitar hechos duplicados u ofensivos).

El contenido de la aplicación se obtiene de internet, pero está siempre disponible offline. Además también dispone de un mapa donde ver desde qué lugares se han enviado más contribuciones (para mantener la privacidad de los usuarios, tan sólo se muestra el recuento de hechos de Chuck Norris enviados desde el lugar, además las coordenadas se redondean para más privacidad, y es imposible saber desde la aplicación el lugar desde el que se ha enviado un hecho de Chuck Norris). Aunque claro, siempre se puede contribuir sin compartir tu posición simplemente seleccionando la opción de “no permitir” que aparece la primera vez que se contribuye.

No es una aplicación del nivel de otras de la App Store, pero es realmente divertida, y viene genial para distraerse en algunos momentos: con tan sólo agitar el dispositivo la aplicación nos mostrará un hecho escogido al azar, de modo que no hace falta revisar listas ni seleccionar nada, tan sólo agitar y leer. Por supuesto, todo esto de forma totalmente gratuita (y preparada para definición estándar y Retina Display), tan sólo hay unos anuncios (iAd) en la parte superior de la pantalla pero no molestan nada y en general son distraídos.

También me gustaría desarrollar una versión para el iPad, pero por falta de tiempo y por la inseguridad sobre el proceso de aprobación de Apple lo dejaré para más adelante. La aplicación también tiene lista una pequeña página mostrando sus virtudes, pero hasta que no la aprueben no haré la página pública. Podéis ver las capturas de la aplicación que he enviado a Apple a continuación:

Y esto es todo, bastante para un sólo artículo. Ha sido un placer escribir aquí casi a diario durante estos dos últimos años, y estoy muy contento de los más de 1100 regalos que habéis hecho algunos de los lectores del blog durante este tiempo. Espero poder publicar algún tutorial interesante de aquí a final de año, pero como de costumbre, no voy a prometer nada. En cuanto a los usuarios de mis proyectos, estoy realmente sorprendido de la cantidad de gente que ha llegado a usarlos, he visto algunos de mis themes en los lugares más insospechados. Esto no es un adiós, es un “Hsata luego y gracias por el pescado”.


Evita que UISearchDisplayController oculte una UINavigationBar


UISearchDisplayControllerWithoutAnimation: Subclase de UISearchDisplayController

El funcionamiento estándar de UISearchDisplayController es ocultar la barra de navegación (UINavigationBar) cuando se inicia una búsqueda. Este comportamiento nos puede parecer adecuado, pero en ciertas ocasiones puede que no queramos que se superponga y queramos tener visible la barra de navegación (UINavigationBar).

Actualmente cuando se activa la barra de búsqueda se ejecuta el método privado setActive:animated:. La única manera de evitar que se oculte la barra de navegación es crear una subclase de UISearchDisplayController y reemplazar dicho método por el siguiente, que anima la barra de búsqueda sin ocultar la barra de navegación (realmente oculta primero la barra de navegación y luego la muestra, de modo que a efectos prácticos parece que siempre está ahí):

[obj-c]
– (void)setActive:(BOOL)visible animated:(BOOL)animated;
{
if (self.active == visible) return;

[self.searchContentsController.navigationController setNavigationBarHidden:YES animated:NO];

[super setActive:visible animated:animated];

[self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];

if (visible)
{
[self.searchBar becomeFirstResponder];
}
else
{
[self.searchBar resignFirstResponder];
}
}
[/obj-c]

La nueva clase puede llamarse, por ejemplo, UISearchDisplayControllerWithoutAnimation (aunque realmente sí que tiene animación). Su interfaz será algo así (recordad que lo heredamos todo de UISearchDisplayController así que no necesitamos declarar ningún método más ni ninguna propiedad, tan sólo reemplazar el método setActive:animated:, que haremos en la implementación):

[obj-c]#import <UIKit/UIKit.h>

@interface UISearchDisplayControllerWithoutAnimation : UISearchDisplayController
{
}

@end

[/obj-c]

Y la implementación:

[obj-c]

#import "UISearchDisplayControllerWithoutAnimation.h"

@implementation UISearchDisplayControllerWithoutAnimation

– (void)setActive:(BOOL)visible animated:(BOOL)animated;
{
if (self.active == visible) return;

[self.searchContentsController.navigationController setNavigationBarHidden:YES animated:NO];

[super setActive:visible animated:animated];

[self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];

if (visible)
{
[self.searchBar becomeFirstResponder];
}
else
{
[self.searchBar resignFirstResponder];
}
}

@end

[/obj-c]

Añadiendo un UISearchDisplayController en Interface Builder
Añadiendo un UISearchDisplayController en Interface Builder
Cambiando la clase del UISearchDisplayController
Cambiando la clase del UISearchDisplayController

Ahora sólo queda usar UISearchDisplayControllerWithoutAnimation en lugar de UISearchDisplayController. Si hemos añadido la barra de búsqueda directamente desde Xcode, sin usar Interface Builder, no hay ningún problema, y si hemos usado Interface Builder basta con cambiar la clase del UISearchDisplayController a UISearchDisplayControllerWithoutAnimation. Si queremos añadir una nueva barra de búsqueda que no oculte la barra de navegación basta con añadir desde la librería un UISearchDisplayController, como de costumbre, y una vez añadido cambiarle la clase a UISearchDisplayControllerWithoutAnimation.

La única pega de este sistema es que tal vez en alguna nueva versión de iOS cambien el método privado setActive:animated:, con lo cual habría que revisar este nuevo método y actualizar nuestra clase personalizada. De todas maneras, parece algo poco probable, al menos en un futuro inmediato. Este método nuevo funciona sin problemas en iOS 4 y iOS 4.1, aunque seguramente funcione también en versiones anteriores (yo sólo he probado estas dos).