All posts tagged guide

Personalizar el componente UISwitch en el iPhone

En uno de los proyectos en los que estoy trabajando ahora me tocó meterle mano a el componente UISwitch de la SDK del iPhone. Según la documentación oficial de Apple este componente no es customizable, pero nada más lejos de la realidad. Por suerte en uno de los libros que tengo de desarrollo para el iPhone (el Developers Cookbook de Erica Sadun) viene una primera aproximación de como crear la clase UICustomSwitch con los métodos necesarios para modificar las dos etiquetas.

En una primera lectura en libro pone tanto las partes de implementación como las de definición de clase en el main.h, cosa que no me gusta mucho. Además esto nos obliga a picar todo el código y nos capa la posibilidad de usar la clase dentro de otras vistas.

Así que dejaré mi aportación y estructuración del UICustomSwitch para poder usarlo en el InterfaceBuilder también.

Como todo me gusta tener el código siempre bien ordenado, así que siempre tengo mi grupo de Categories donde meter los objetos que extienden a otros:

XCode GroupsPara que quede un poco más claro el código la estructura interna de objetos de un UISwitch es la siguiente:

  • UISwitch
    • UISwitchSlider
      • UIImageView
      • UIImageView
      • UIView
        • UILabel
        • UILabel
      • UIImageView

Claramente tenemos que atacar en nuestro UICustomSwitch a los UILabels, pero con mucho cuidado. Por alguna extraña razón el SDK se comporta de forma diferente dependiendo del idioma en el que tengas configurado el teléfono. Mientras tenía este post con los borradores, cargue la aplicación por primera vez en el teléfono donde para mi sorpresa fallaba al arrancar. Vamos a ver el código y después explico la jugada.

#import 

@interface UICustomSwitch : UISwitch
- (void) setLeftLabelText: (NSString *) labelText;
- (void) setRightLabelText: (NSString *) labelText;
@end
#import "UICustomSwitch.h"

@interface _UISwitchSlider : UIView
@end

@implementation UICustomSwitch

- (_UISwitchSlider *) slider {
	return [[self subviews] lastObject];
}

- (UIView *) textHolder {
	return [[[self slider] subviews] objectAtIndex:2];
}

- (UILabel *) leftLabel {
	return [[[self textHolder] subviews] objectAtIndex:0];
}

- (UILabel *) rightLabel {
	return [[[self textHolder] subviews] objectAtIndex:1];
}

- (void) setLeftLabelText: (NSString *) labelText {
	NSLocale *currentUsersLocale = [NSLocale currentLocale];
	if ([[currentUsersLocale localeIdentifier] isEqualToString:@"en_US"]) {
		[[self leftLabel] setText:labelText];
	}

}

- (void) setRightLabelText: (NSString *) labelText {
	NSLocale *currentUsersLocale = [NSLocale currentLocale];
	if ([[currentUsersLocale localeIdentifier] isEqualToString:@"en_US"]) {
		[[self rightLabel] setText:labelText];
	}
}
@end

Como podéis ver en el código nos sacamos la clase _UISwitchSlider (que no viene documentada en la SDK para entrar en las tripas del Switch. El problema que os comentaba antes es que las subvistas que nos devuelve el slider, al cambiar de idioma (que no sea en_US), devuelve un UIImageView de los primeros. Por lo que habría que afinar un poco esta clase para que reciba texto e imagen y use una u otra dependiendo de la situación.

Agregando estas clases al proyecto podréis usar el componente también en el IB sin ningún problema. Espero os sirva de ayuda.

Fuentes: "The iPhone Developer's Cookbook de Erica Sadun"

Como crear un Blog de 0 en Rail

En Six Revisions, Phil McClure ha publicado un excelente How To para principiantes en el mundo de Rails, que explica paso a pasa como crear lo más básico de un Blog. Para ello presenta el sistema de scaffolding, como funciona ActiveRecord, etc… Muy recomendado para todo aquellos que querais empezar a caminar con Ruby y usar Rails para apliaciones web.

Os dejo el enlace a el how to aquí, está en inglés.