ios - descargar - Personalizar la fuente UINavigationBar
ios 7 (5)
Basado en la respuesta de @Abramodj (que no funciona), intenté esto. Es de suponer que no ocurría nada en esa solución, ya que el sistema nota que el texto no ha cambiado realmente. Cambiar a nada y volver a arreglarlo.
Probado como definitivamente trabajando en iOS5.0.
// iOS5 has a bug where if you switch orientation the title bar text gets cut off...
-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
self.navigationItem.title = @"";
self.navigationItem.title = @"Your Title";
}
Estoy tratando de personalizar mi fuente UINavigationBar, usando el siguiente código para iOS 5 en la aplicación del delegado de mi application:didFinishLaunchingWithOptions
:
if ([[UINavigationBar class] respondsToSelector:@selector(appearance)])
{
[[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
[UIColor whiteColor], UITextAttributeTextColor,
[UIColor blackColor], UITextAttributeTextShadowColor,
[NSValue valueWithUIOffset:UIOffsetMake(1, 0)], UITextAttributeTextShadowOffset,
[UIFont fontWithName:kDefaultFont size:0.0], UITextAttributeFont,
nil]];
}
Funciona bien y la barra de navegación se representa con mi fuente. Genial.
Las references que he encontrado sugieren que puede usar el tamaño de fuente de cero y cambiará el tamaño de la fuente para que se ajuste a su barra de navegación (usando una fuente ligeramente más pequeña para la barra de navegación más corta para el diseño horizontal). Y elige un tamaño de fuente que se ajuste bien a la altura de la barra de navegación. Pero parece que si pasas de vertical a horizontal y de vuelta, el ancho de la etiqueta de título de la barra de navegación se arruina, por lo que lo que aparece como título, por ejemplo, "Barra de título larga", se ve bien cuando lo ves por primera vez. en orientación vertical, se ve bien cuando lo ves en horizontal (con la fuente apropiadamente más pequeña), pero cuando vuelvo a la vertical, la fuente regresa correctamente a la fuente más grande, pero el texto del título se trunca, convirtiéndose en "Largo ... . "aunque hay un montón de espacio para el título completo. ¿Alguien más ha visto este comportamiento cuando usa un tamaño de fuente de 0.0?
Claramente, solo puedo especificar un tamaño de fuente real (en cuyo caso no veo este comportamiento truncador), pero luego estoy calculando manualmente qué tamaño usar. Y lo que es peor, el tamaño de fuente es el mismo para horizontal y vertical, así que ahora mismo estoy usando un tamaño de fuente que se ajusta al título más corto de la barra de navegación horizontal y el título es más pequeño de lo que debe ser en la barra de navegación vertical más alta.
¿Alguien por ahí ha tenido experiencia con el uso de setTitleTextAttributes
para cambiar la fuente de la [UINavigationBar appearance]
de tal manera que el tamaño de la fuente cambie entre vertical y horizontal, pero no tenga este corte del título cuando regrese a vertical después de ir a ¿paisaje? Estoy a punto de dedicarme a varias soluciones alternativas, pero si tiene alguna experiencia en este tema, avíseme.
Actualizar:
En el proceso de enviar este error a Apple, decidí demostrar cómo reproducir el problema:
Crear una nueva aplicación de detalles maestros de iOS en Xcode 4.3.2.
Ponga el código de
setTitleTextAttributes
en la aplicación del delegado de laapplication:didFinishLaunchingWithOptions
(usé la fuente @ "GillSans").Vaya a MasterViewController y agregue una línea que diga
self.title = @"Long Title";
Comente el código
UIBarButtonItem *addButton
.Ejecuta el programa. Tenga en cuenta que el título correctamente dice "Título largo". Girar al paisaje. Todavía se ve bien. Gire de nuevo al retrato y el título ahora dice "Largo ..." aunque haya mucho espacio.
Curiosamente, si restaura el código
UIBarButtonItem *addButton
, el título funciona como debería. Pero si elimina el elemento UIBarButton, o lo reemplaza con un botón que usainitWithTitle
lugar deinitWithBarButtonSystemItem
, obtiene el problema con el título de la barra de navegación después de rotar de vertical a horizontal y luego de nuevo a vertical.
Creo que una buena solución es actualizar el título de tu barra de navegación después de una rotación de dispositivo. Algo como
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
self.navigationItem.title = @"Your title";
}
¡Espero que esto ayude!
El error en el que se corta un texto de título de UINavigationBar después de aplicar los cambios a través de la apariencia puede ocurrir incluso si no está cambiando de orientación como lo describe Ben Clayton. He visto que este problema ocurre en una aplicación que solo admite orientación vertical.
[self.navigationItem setTitle:@""];
[self.navigationItem setTitle:@"The real title"];
Funcionará bien incluso en tal caso.
Por cierto, he tenido este problema desde iOS 5. Acabo de probarlo ahora mismo en iOS 6 y TODAVÍA HAY. ¿Qué diablos, Apple?
Por cierto, me olvidé de señalar que Apple respondió a mi informe de errores, reconociendo que se trataba de un problema conocido. Esperemos que se resuelva pronto!
la siguiente es mi solución para este problema, y aquí está el comentario que aparece junto a mi implementación de solución en cada caso como un recordatorio para mí acerca de por qué implementé este bit de código:
// when using an appearance proxy to set a custom font for the navigation bar (generally in
// application:didFinishLaunchingWithOptions: in the appDelegate code) for both iOS 5 & 6,
// there''s a glitch that incorrectly auto-truncates the title in the following cirumstances:
//
// 1) when a 0.0 value is used for UITextAttributeFont in the titleTextAttributes dictionary
// and a device/simulator running pre-iOS 5 rotates back to portrait from landscape
// solution: perform [self.navigationController.navigationBar setNeedsLayout] in
// didRotateFromInterfaceOrientation: the view controller in which the
// auto-truncation is incorrectly occurring for systemVersion < 6.0
//
// 2) when a view initially loads running iOS 6 for a non-0.0 value for the UITextAttributeFont
// in the titleTextAttributes dictionary
// solution: perform [self.navigationController.navigationBar setNeedsLayout]
// in viewDidLoad in the view controller in which the auto truncation is
// incorrectly occurring for systemVersion >= 6.0
UITextAttributeFont
, para los casos en los que estoy de acuerdo con el uso del valor 0.0 para UITextAttributeFont
pero tengo que continuar soportando iOS5, uso la solución (1):
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)
&& UIDevice.currentDevice.systemVersion.floatValue < 6.0)
[self.navigationController.navigationBar setNeedsLayout];
}
#endif
y en el par de casos de código heredado en los que quise admitir iOS 6 y corregir el problema cuando la vista aparece por primera vez sin tener que volver a escribir los métodos de la clase MyAppAppearance, tengo valores no-0.0 para mi [UINavigationBar appearance] titleTextAttributes
, encontré más fácil implementar la solución (2) así:
- (void)viewDidLoad
{
[super viewDidLoad];
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0
if (UIDevice.currentDevice.systemVersion.floatValue >= 6.0)
#endif
[self.navigationController.navigationBar setNeedsLayout];
// … other viewDidLoadCode
(y el corchete __IPHONE_OS_VERSION_MIN_REQUIRED
solo me ayuda a recordarme qué código puede desaparecer eventualmente si se desea en el futuro, y cuál tendrá que quedarse).
para ver un poco más exactamente lo que sucede aquí, especialmente en el caso de la rotación, ejecute el simulador con animaciones lentas activadas.