iOS 7 y Helvetica Neue UltraLight: use como pnetworkingeterminado para versiones antiguas de iOS

Que yo sepa, la fuente pnetworkingeterminada de iOS 7 es Helvetica Neue UltraLight , que es mucho más delgada en comparación con su audaz pnetworkingecesora. Para proporcionar un layout consistente y hacer que mis próximas aplicaciones se vean iguales en todas las versiones comunes de iOS, me gustaría aplicar Helvetica Neue UltraLight como la fuente pnetworkingeterminada (primaria) de la aplicación.

Con mucho gusto, esta "nueva fuente" está disponible desde la versión 5.0 de iOS , por lo que ya es compatible con las versiones anteriores a iOS 7. Lamentablemente, la única forma en que pensé usarla es llamar manualmente a [UIFont fontWithName:@"HelveticaNeue-UltraLight" size:size] en la fuente de cada UIView, que es tedioso y propenso a errores a la inconsistencia.

Entonces mi pregunta es: ¿cuál es tu manera de hacer esto o cómo manejas este cambio de layout?

Aquí está la solución de time de ejecución de Objective-C:

 @interface UIFont (CustomSystemFont) + (UIFont *)ln_systemFontOfSize:(CGFloat)fontSize; + (UIFont *)ln_boldSystemFontOfSize:(CGFloat)fontSize; + (UIFont *)ln_italicSystemFontOfSize:(CGFloat)fontSize; @end @implementation UIFont (CustomSystemFont) + (void)load { Method orig = class_getClassMethod([UIFont class], @selector(systemFontOfSize:)); Method swiz = class_getClassMethod([UIFont class], @selector(ln_systemFontOfSize:)); method_exchangeImplementations(orig, swiz); orig = class_getClassMethod([UIFont class], @selector(boldSystemFontOfSize:)); swiz = class_getClassMethod([UIFont class], @selector(ln_boldSystemFontOfSize:)); method_exchangeImplementations(orig, swiz); orig = class_getClassMethod([UIFont class], @selector(italicSystemFontOfSize:)); swiz = class_getClassMethod([UIFont class], @selector(ln_italicSystemFontOfSize:)); method_exchangeImplementations(orig, swiz); } + (UIFont *)ln_systemFontOfSize:(CGFloat)fontSize { if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) { //Call original implementation. return [self ln_systemFontOfSize:fontSize]; } return [UIFont fontWithName:@"HelveticaNeue" size:fontSize]; } + (UIFont *)ln_boldSystemFontOfSize:(CGFloat)fontSize { if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) { //Call original implementation. return [self ln_systemFontOfSize:fontSize]; } return [UIFont fontWithName:@"HelveticaNeue-Medium" size:fontSize]; } + (UIFont *)ln_italicSystemFontOfSize:(CGFloat)fontSize { if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) { //Call original implementation. return [self ln_systemFontOfSize:fontSize]; } return [UIFont fontWithName:@"HelveticaNeue-Italic" size:fontSize]; } @end 

Lo que hago en este ejemplo es replace los tres methods de fuente del sistema con los míos y probar para ver si la versión del sistema es 7 o superior. Si es así, utilizo los methods originales, de lo contrario, devuelvo una fuente de mi elección (en este caso Helvetica Neue con peso UltraLight para las requestes regulares y cursivas, y Mediano para requestes en negrita).

Esto funciona para todo lo generado en el código, incluidas las vistas creadas por el sistema. No funciona cuando se cargan vistas desde files Xib y Storyboard, porque las fonts están codificadas en el file NIB. Use el selector de fuente para elegir la fuente que necesita.

¿Por qué no solo usamos la apariencia API?

  [[UILabel appearance] setFont:[UIFont fontWithName:@"YourFontName" size:14.0]]; 

UIAppearance API

Sin romper NDA al ser específico sobre los nombres del método, ¿por qué no declarar una categoría en UIFont para imitar los nuevos methods para el tipo dynamic?

Para aquellos que buscan una solución en storyboards, tuve un poco de éxito abriendo el file storyboard en un editor de text y haciendo una búsqueda / reemploop. Tienes que atrapar cada tipo de fuente que deseas cambiar (por ejemplo, Bold / Italic), pero pude replace la fuente del sistema estándar con HelveticaNeue UltraLight reemplazando:

 key="fontDescription" type="system" 

con

 key="fontDescription" name="HelveticaNeue-UltraLight" family="Helvetica Neue" 

Para negrita, replaceías:

 key="fontDescription" type="boldSystem" 

Elegí replace mis fonts negritas con la misma fuente UltraLight, pero para aquellos que desean un tratamiento "audaz", puedes elegir "HelveticaNeue-Thin".

¡Recomiendo utilizar el control de versiones o hacer una copy de respaldo de su file antes de hacer esto!