En iOS 7, mis títulos de UIButton están entrando y saliendo 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 al instante y sin un marco en blanco. Este parpadeo es especialmente molesto y desvía la atención de otras animaciones.
self.button.titleLabel.text = text
. Pero esto no cambia el tamaño del marco de la etiqueta y no funciona con UIControlStates correctamenteRespuestas:
Esto funciona para botones personalizados:
Para los botones del sistema, debe agregar esto antes de volver a habilitar las animaciones (gracias @Klaas):
fuente
[_button layoutIfNeeded];
Use el
performWithoutAnimation:
método y luego fuerce el diseño para que ocurra inmediatamente en lugar de más adelante.fuente
[button layoutIfNeeded];
dentro del bloque.Cambie el tipo de botón a un generador de interfaz de formulario personalizado.
Esto funcionó para mí.
fuente
En Swift puedes usar:
fuente
layoutIfNeeded()
, el botón se marca como necesario volver a dibujar, pero esto no sucederá hasta el próximo pase de diseño, que estará fuera delperformWithoutAnimation
Tenga en cuenta :
cuando " buttonType " de _button es "UIButtonTypeSystem" , el siguiente código no es válido :
cuando " buttonType " de _button es "UIButtonTypeCustom" , el código anterior es válido .
fuente
A partir de iOS 7.1, la única solución que funcionó para mí fue inicializar el botón con el tipo
UIButtonTypeCustom
.fuente
entonces encuentro la solución trabajada:
primero cambiamos el título del botón, luego cambiamos el tamaño del botón para este título
fuente
Establezca el tipo de botón en UIButtonTypeCustom y dejará de parpadear
fuente
Swift 5
fuente
Hice una extensión Swift para hacer esto:
Funciona para mí en iOS 8 y 9, con
UIButtonTypeSystem
.(El código es para Swift 2, Swift 3 y Objective-C debería ser similar)
fuente
Establezca el tipo UIButton como Personalizado. Eso debería eliminar las animaciones de fundido de entrada y salida.
fuente
Por lo general, simplemente configurar el tipo de botón en Personalizado funciona para mí, pero por otras razones necesitaba subclasificar UIButton y volver a establecer el tipo de botón en el predeterminado (Sistema), por lo que el parpadeo volvió a aparecer.
Establecer
UIView.setAnimationsEnabled(false)
antes de cambiar el título y luego volver a verdadero después de eso no evitó el parpadeo para mí, no importa si llamé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 configurar la clase personalizada para el botón en el Guión gráfico también).
2) Anular de la
setTitle:forState:
siguiente manera:En Interface Builder, puede dejar el tipo de botón en Sistema, no es necesario cambiarlo a Tipo personalizado para que este enfoque funcione.
Espero que esto ayude a alguien más, he luchado durante tanto tiempo con los molestos botones parpadeantes que espero evitarlo para otros;)
fuente
layoutIfNeeded()
:]Simplemente puede crear un botón personalizado y dejará de animarse mientras cambia el título.
también puede hacerlo en la casilla de verificación Storyboard: seleccione el botón en storyboard -> 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!
fuente
Puede eliminar las animaciones de la capa de la etiqueta del título:
fuente
Swift 4 versión de Xhacker Liu respuesta
fuente
UIButton con
system
tipo tiene animación implícita activadasetTitle(_:for:)
. Puedes arreglarlo de dos maneras diferentes:custom
, desde el código o el Generador de interfaces:fuente
Descubrí que esta solución también funciona con UIButtonTypeSystem , pero solo funcionará si el botón está habilitado por algún motivo.
Por lo tanto, deberá agregarlos si necesita deshabilitar el botón al configurar su título.
(iOS 7, Xcode 5)
fuente
[_button setTitle:@"title" forState:UIControlStateDisabled]
La combinación de excelentes respuestas anteriores da como resultado la siguiente solución para UIButtonTypeSystem :
fuente
Tengo el problema de la animación fea al cambiar los títulos de los botones en los controladores de vista dentro de un UITabBarController. Los títulos que originalmente se establecieron en el guión gráfico aparecieron por un corto tiempo 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;
Descubrí que lo que desencadena la animación es realmente la llamada a btn.titleLabel.text. Por lo tanto, para seguir utilizando los guiones gráficos y tener los componentes localizados dinámicamente de esta manera, me aseguro de establecer la ID de restauración de cada botón (en el Inspector de identidad) al mismo título y usar eso como clave en lugar del título;
No es ideal, pero funciona.
fuente
En realidad, puede establecer el título fuera de un bloque de animación, solo asegúrese de llamar
layoutIfNeeded()
dentro de un performWithoutAnimation:Si tiene un montón de botones, considere simplemente llamar
layoutIfNeeded()
a la vista súper:fuente
La extensión Xhacker Liu convertida a Swift 3:
fuente
¿Quizás generar 2 animaciones y 2 botones es una mejor solución para evitar el problema que aparece al animar y cambiar el texto de un botón?
Creé un segundo uibutton y generé 2 animaciones, esta solución funciona sin problemas.
fuente
Lo hice funcionar con una combinación de respuestas:
fuente
Una extensión conveniente para el cambio animado del título del botón en Swift que funciona bien con la implementación predeterminada:
fuente
UIButton
.