titlelabel color buttons objective-c swift ios7 uibutton uikit

objective-c - color - menu ios



¿Cómo detener la animación de UIButton no deseada en el cambio de título? (20)

¿Tal vez generar 2 animaciones y 2 botones es una mejor solución, para evitar el problema que está apareciendo al animar y cambiar el texto de un botón?

Creé un segundo uibutton y generé 2 animaciones, esta solución funciona sin saltos.

_button2.hidden = TRUE; _button1.hidden = FALSE; CGPoint startLocation = CGPointMake(_button1.center.x, button1.center.y - 70); CGPoint stopLocation = CGPointMake(_button2.center.x, button2.center.y- 70); [UIView animateWithDuration:0.3 animations:^{ _button2.center = stopLocation;} completion:^(BOOL finished){_button2.center = stopLocation;}]; [UIView animateWithDuration:0.3 animations:^{ _button1.center = startLocation;} completion:^(BOOL finished){_button1.center = startLocation;}];

En iOS 7, mis títulos de UIButton se están animando hacia dentro y hacia fuera en el momento equivocado, tarde. Este problema no aparece en iOS 6. Solo estoy usando:

[self setTitle:text forState:UIControlStateNormal];

Preferiría que esto ocurra instantáneamente y sin un marco en blanco. Este parpadeo es especialmente molesto y aleja la atención de otras animaciones.


A partir de iOS 7.1, la única solución que funcionó para mí fue inicializar el botón con el tipo UIButtonTypeCustom .


Cambiar el tipo de botón al generador de interfaz de formulario personalizado.

Esto funcionó para mí.


Descubrí que esta solución también funciona con UIButtonTypeSystem , pero solo funcionará si el botón está habilitado por alguna razón.

[UIView setAnimationsEnabled:NO]; [_button setTitle:@"title" forState:UIControlStateNormal]; [UIView setAnimationsEnabled:YES];

Por lo tanto, deberá agregarlos si necesita desactivar el botón al configurar su título.

[UIView setAnimationsEnabled:NO]; _button.enabled = YES; [_button setTitle:@"title" forState:UIControlStateNormal]; _button.enabled = NO; [UIView setAnimationsEnabled:YES];

(iOS 7, Xcode 5)


En Swift puedes usar:

UIView.performWithoutAnimation { self.someButtonButton.setTitle(newTitle, forState: .normal) self.someButtonButton.layoutIfNeeded() }


En realidad, puede establecer el título fuera de un bloque de animación, solo asegúrese de llamar a layoutIfNeeded() dentro de un performWithoutAnimation:

button1.setTitle("abc", forState: .Normal) button2.setTitle("abc", forState: .Normal) button3.setTitle("abc", forState: .Normal) UIView.performWithoutAnimation { self.button1.layoutIfNeeded() self.button2.layoutIfNeeded() self.button3.layoutIfNeeded() }

Si tiene layoutIfNeeded() botones, considere llamar a layoutIfNeeded() en la layoutIfNeeded() :

button1.setTitle("abc", forState: .Normal) button2.setTitle("abc", forState: .Normal) button3.setTitle("abc", forState: .Normal) UIView.performWithoutAnimation { self.view.layoutIfNeeded() }


Establezca UIButton tipo como personalizado. Eso debería eliminar las animaciones de fundido de entrada y salida.


Establezca el tipo de botón en UIButtonTypeCustom y dejará de parpadear


Esto funciona para botones personalizados:

[UIView setAnimationsEnabled:NO]; [_button setTitle:@"title" forState:UIControlStateNormal]; [UIView setAnimationsEnabled:YES];

Para los botones del sistema, debe agregar esto antes de volver a habilitar las animaciones (gracias @Klaas):

[_button layoutIfNeeded];


He hecho una extensión Swift para hacer esto:

extension UIButton { func setTitleWithoutAnimation(title: String?) { UIView.setAnimationsEnabled(false) setTitle(title, forState: .Normal) layoutIfNeeded() UIView.setAnimationsEnabled(true) } }

Funciona para mí en iOS 8 y 9, con UIButtonTypeSystem .

(El código es para Swift 2, Swift 3 y Objective-C deberían ser similares)


La combinación de las respuestas anteriores da como resultado la siguiente solución alternativa para UIButtonTypeSystem :

if (_button.enabled) { [UIView setAnimationsEnabled:NO]; [_button setTitle:@"title" forState:UIControlStateNormal]; [UIView setAnimationsEnabled:YES]; } else // disabled { [UIView setAnimationsEnabled:NO]; _button.enabled = YES; [_button setTitle:@"title" forState:UIControlStateNormal]; _button.enabled = NO; [UIView setAnimationsEnabled:YES]; }


La extensión Xhacker Liu convertida a Swift 3:

extension UIButton { func setTitleWithoutAnimation(title: String?) { UIView.setAnimationsEnabled(false) setTitle(title, for: .normal) layoutIfNeeded() UIView.setAnimationsEnabled(true) } }


Lo tengo que trabajar con una combinación de respuestas:

[[[button titleLabel] layer] removeAllAnimations]; [UIView performWithoutAnimation:^{ [button setTitle:@"Title" forState:UIControlStateNormal]; }];


Obtuve el problema de la animación fea cuando cambio los títulos de los botones en los controladores de visualización dentro de un UITabBarController. Los títulos que se establecieron originalmente en el guión gráfico aparecieron durante un tiempo breve antes de desvanecerse en sus nuevos valores.

Quería iterar a través de todas las subvistas y usar los títulos de los botones como claves para obtener sus valores localizados con NSLocalizedString, como;

for(UIView *v in view.subviews) { if ([v isKindOfClass:[UIButton class]]) { UIButton *btn = (UIButton*)v; NSString *newTitle = NSLocalizedString(btn.titleLabel.text, nil); [btn setTitle:newTitle]; } }

Descubrí que lo que desencadena la animación es realmente la llamada a btn.titleLabel.text. Así que para seguir utilizando los guiones gráficos y tener los componentes dinámicamente localizados de esta manera, me aseguro de configurar el ID de restauración de cada botón (en el Inspector de identidad) al mismo título y usarlo como clave en lugar del título;

for(UIView *v in view.subviews) { if ([v isKindOfClass:[UIButton class]]) { UIButton *btn = (UIButton*)v; NSString *newTitle = NSLocalizedString(btn.restorationIdentifier, nil); [btn setTitle:newTitle]; } }

No es ideal, pero funciona ..


Por lo general, simplemente configurar el tipo de botón como Personalizado funciona para mí, pero por otras razones necesité la subclase UIButton y restablecer el tipo de botón al valor predeterminado (Sistema), por lo que reapareció el parpadeo.

Establecer UIView.setAnimationsEnabled(false) antes de cambiar el título y luego a true nuevamente después de eso no evitó que parpadeara, no importa si llamé a self.layoutIfNeeded() o no.

Esto, y solo esto en el siguiente orden exacto, funcionó para mí con iOS 9 y 10 beta:

1) Cree una subclase para UIButton (no olvide establecer la clase personalizada para el botón en el Storyboard también).

2) Reemplazar setTitle:forState: siguiente manera:

override func setTitle(title: String?, forState state: UIControlState) { UIView.performWithoutAnimation({ super.setTitle(title, forState: state) self.layoutIfNeeded() }) }

En Interface Builder, puede dejar el tipo de botón en Sistema, sin necesidad de cambiarlo a Tipo personalizado para que este enfoque funcione.

Espero que esto ayude a otra persona, he luchado durante tanto tiempo con los molestos botones parpadeantes que espero evitar a los demás;)


Puede eliminar las animaciones de la capa de la etiqueta del título:

[[[theButton titleLabel] layer] removeAllAnimations];


Simplemente puede crear el botón Personalizar y dejará de animar mientras cambia el título.

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; [btn setTitle:@"the title" forState:UIControlStateNormal];

también puede hacerlo en la casilla de verificación Storyboard: seleccione el botón en el guión gráfico -> seleccione el inspector de atributos (cuarto desde el lado izquierdo) -> en el menú desplegable "Tipo", seleccione "Personalizado" en lugar de "Sistema" que probablemente fue seleccionado .

¡Buena suerte!


Utilice el método performWithoutAnimation: y luego forzar el diseño para que ocurra inmediatamente en lugar de hacerlo más adelante.

[UIView performWithoutAnimation:^{ [self.myButton setTitle:text forState:UIControlStateNormal]; [self.myButton layoutIfNeeded]; }];


entonces encuentro la solución trabajada:

_logoutButton.titleLabel.text = NSLocalizedString(@"Logout",); [_logoutButton setTitle:_logoutButton.titleLabel.text forState:UIControlStateNormal];

en primer lugar, cambiamos el título del botón, luego cambiamos el tamaño del botón para este título


Tenga en cuenta :

cuando " buttonType " de _button es "UIButtonTypeSystem" , el siguiente código no es válido :

[UIView setAnimationsEnabled:NO]; [_button setTitle:@"title" forState:UIControlStateNormal]; [UIView setAnimationsEnabled:YES];

cuando " buttonType " de _button es "UIButtonTypeCustom" , el código anterior es válido .