Cuando llamo setTitle en un UIButton, el botón parpadeará en iOS 7. Traté de configuración myButton.destacó = NO, pero que no deje el botón de parpadear.

[myButton setTitle:[[NSUserDefaults standardUserDefaults] stringForKey:@"elapsedLabelKey"] forState:UIControlStateNormal];

myButton.highlighted = NO;

Aquí es ¿cómo puedo configurar el temporizador en el que se actualicen los títulos:

- (void)actionTimer {
    if (myTimer == nil) {

        myTimer = [NSTimer scheduledTimerWithTimeInterval: 1.0
                        target: self
                        selector: @selector(showActivity)
                        userInfo: nil
                        repeats: YES];
    }
}

Aquí es el método que actualiza los títulos:

- (void)showActivity {

    NSString *sym = [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol];

    if (pauseInterval == nil) {

        //Update clock
        seconds = [[NSDate date] timeIntervalSinceDate:startInterval] - breakTime;

        //Update total earned
        secRate = rate.value /60 /60;
        total = secRate * seconds;
        [totalLabel setTitle:[NSString stringWithFormat:@"%@%.4f",sym,total] forState:UIControlStateNormal];

        days = seconds /(60 * 60 * 24);
        seconds -= days * (60 * 60 * 24);
        int hours = seconds /(60 * 60);
        fhours = (float)seconds /(60.0 * 60.0);
        seconds -= hours * (60 * 60);
        int minutes = seconds /60;
        seconds -= minutes * 60;

        //Update the timer clock
        [elapsed setTitle:[NSString stringWithFormat:@"%.2i:%.2i:%.2i:%.2i",days,hours,minutes,seconds] forState:UIControlStateNormal];
    }
}
  • No debería ser intermitente. Están tratando de hacer esto en un subproceso en segundo plano?
  • Sí, es que se establece un temporizador para actualizar el título del botón de cada segundo (que creo que crear su propio hilo)
  • Temporizadores sólo se ejecuta en un hilo separado si se hacerlo. Podemos ver que el método en donde el título se presenta la actualización y la manera de configurar el temporizador?
  • He añadido los códigos solicitada a la pregunta principal
  • Posibles duplicados de Cómo detener no deseados UIButton animación sobre el cambio de título?
  • Esta respuesta de G. S. Koti trabajado para mí, stackoverflow.com/a/35362156/9576580

InformationsquelleAutor FierceMonkey | 2013-10-15

10 Comentarios

  1. 16

    El parpadeo no es causado por el temporizador de por sí. El UIButton método setTitle:forState causas de parpadeo de la luz. Una obra sencilla es utilizar un UIButton con ningún título y para superponer un UILabel. Cuando se cambia el UILabel texto, no flash.

    • mi UIButton en el modo personalizado sigue parpadeando. Mi solución es desactivar por completo su interacción con el usuario por [btn setUserInteractionEnabled:NO];
    • Extraño la sugerencia de que el ajuste de [yourButton buttonWithType:UIButtonTypeCustom] funciona a la perfección para mí. No se inmutó cuando el botón se actualiza con setTitle.
    • Como dice Adama, ajuste el botón del tipo de UIButtonTypeCustom correcciones de este. No más de parpadear.
    • Cómo puede ser aceptada respuesta si no responde a la pregunta…
    • La respuesta correcta es utilizar performWithoutAnimation (ver otras respuestas en esta página), no hay necesidad de establecer el botón personalizado.
  2. 173

    Establecer el tipo de botón para UIButtonTypeCustom y dejará de parpadear

    • Esto realmente debe ser la mejor respuesta. La solución más simple. Y su trabajo.
    • De acuerdo. He intentado un montón de otras soluciones, y esto es lo que hizo, todo por sí mismo.
    • Obras de mí en Xcode 7.3.1!!
    • Esto debe ser aceptado respuesta. La solución más sencilla y tan lejos.
    • Funciona como un encanto! Gracias
    • Definitivamente la respuesta correcta aquí.
    • Creo que esto realmente una buena solución sin necesidad de escribir ningún código.
    • Esta es la mejor respuesta
    • Esto funciona para mí también. Sin embargo, no entiende la razón detrás de ella.
    • Se dice que no se puede asignar a buttonType, es obtener una única propiedad
    • Funciona para ios 12.
    • Esta solución funciona, pero perderá algunos de los beneficios de los botones del sistema, tales como el estado presionado animación (cuando el usuario pulsa y mantiene en el botón que obtener información visual que se pulsa el botón). Yo prefiero Cœur de la solución stackoverflow.com/a/39071660/337934

  3. 37

    Un enfoque mejor que [UIView setAnimationsEnabled:NO] que puede afectar a otras animaciones es deshabilitar sólo el título específico de la animación.

    Objective-C:

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

    Swift:

    UIView.performWithoutAnimation { 
        myButton.setTitle(text, for: .normal)
        myButton.layoutIfNeeded()
    }
    
    • Justo ahora trató de la solución rápida en el más reciente de iOS funciona muy bien.
    • El día de salvador. Saludos!
    • Solo esta probado en Swift 3, y funciona sin el uso de layoutIfNeeded()
    • Esto debe ser aceptado respuesta sin duda!!
    • Eres un genio! Aceptado la respuesta es un cojo hack, el segundo popular sólo destruye toque de animación que es el punto entero de tener un botón. Gracias!
    • Esta es la mejor manera de hacer esto. Gran respuesta!

  4. 30

    *Por favor nota *

    cuando «buttonType» de _button es «UIButtonTypeSystem», a continuación el código es no válido

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

    cuando «buttonType» de _button es «UIButtonTypeCustom», código de arriba es válido.

  5. 18

    Ver las respuestas de Cómo detener no deseados UIButton animación sobre el cambio de título? :

    [UIView setAnimationsEnabled:NO];
    [elapsed setTitle:[NSString stringWithFormat:@"%.2i:%.2i:%.2i:%.2i",days,hours,minutes,seconds] forState:UIControlStateNormal];
    [UIView setAnimationsEnabled:YES];
    
    • Todavía parpadea incluso con este código en el lugar.
    • Esto funcionó para mí – darle una oportunidad si se enfrentan a este problema.
    • trate de añadir una llamada a layoutIfNeeded:[elapsed layoutIfNeeded];. Quitar el parpadeo en mi caso.
    • layoutIfNeeded que hizo por mí.
    • Parece ser un lugar sucio solución, sin embargo layoutIfNeeded parece estar trabajando
  6. 7

    Defecto «setTitle» comportamiento es, sin duda lleno de odio!

    Mi solución es:

    [UIView setAnimationsEnabled:NO];
    [_button layoutIfNeeded]; 
    [_button setTitle:[NSString stringWithFormat:@"what" forState:UIControlStateNormal];
    [UIView setAnimationsEnabled:YES];
    

    También, en el storyboard, bajo el botón de la propiedad que desmarcar:

    • Invierte En Resaltar
    • Destacó Ajustar La Imagen De

    Y verificación:

    • Movilidad Ajustar La Imagen De

    Probado y de trabajo en iOS 8 demasiado.

    Actualización – Swift

    Sugiero que usted pueda crear su propio botón y reemplazar setTitle método.

    class UnflashingButton: UIButton {
    
        override func setTitle(title: String?, forState state: UIControlState) {
            UIView.setAnimationsEnabled(false)
            self.layoutIfNeeded()
            super.setTitle(title, forState: state)
            UIView.setAnimationsEnabled(true)
        }
    
    }
    
    • funciona para UIBarbutton también.
    • He probado este enfoque (subclases, anulando setTitle:forState: y desactivación de habilitación de UIView.setAnimationsEnabled). No trabajo para mí en iOS 9 y 10 de la beta. Funciona si solo me desactivar las animaciones, pero luego se pierden por cada UIView…
  7. 6

    Usted puede simplemente hacer otra función para UIButton de fácil uso futuro.

    extension UIButton {
        func setTitleWithoutAnimation(_ title: String?, for controlState: UIControlState) {
            UIView.performWithoutAnimation {
                self.setTitle(title, for: controlState)
                self.layoutIfNeeded()
            }
        }
    }
    

    Que es!

    Y acaba de establecer el título como el de antes, pero sustituir el setTitle con setTitleWithoutAnimation

  8. 2

    Probar esto, esto funciona en las versiones más recientes de IOS:

    class CustomButtonWithNoEffect : UIButton {
        override func setTitle(_ title: String?, for state: UIControlState) {
            UIView.performWithoutAnimation {
                super.setTitle(title, for: state)
                super.layoutIfNeeded()
            }
        }
    
    }
    
  9. 0

    Soy nuevo en la codificación y Stackoverflow, así que no tengo suficiente reputación para comentar directamente para ampliar https://stackoverflow.com/users/4673064/daniel-tseng excelente respuesta. Así que tengo que escribir mi propia respuesta, y es esta:

    extension UIButton {
        func setTitleWithoutAnimation(_ title: String?, for controlState: UIControlState) {
            UIView.performWithoutAnimation {
                self.setTitle(title, for: controlState)
                self.layoutIfNeeded()
            }
        }
    }
    

    Funciona muy bien, EXCEPTO:

    Si todas mis llamadas más tarde en el código para «setTitleWithoutAnimation» no se especifica un remitente, luego me sale estos extraños mensajes relacionados con CoreMedia o CoreData, por ejemplo, «no se pudo heredar CoreMedia permisos de 2526: (null)»

    Este es probablemente bastante básico para la codificación y iOS, pero para mí como un nuevo programador, se me envió a un conejo camino por un tiempo, como en: Hoy en día la Extensión no pudo heredar CoreMedia permisos de, donde la gente tenía respuestas interesantes, pero que NO llegue a la raíz de mi problema.

    Así que finalmente me di cuenta de que tenía que ir a través de y dar mi parámetros de las funciones de los parámetros, es decir, yo tenía que especificar un remitente. Que el remitente puede ser UIButton, Cualquier, o AnyObject. Todos los trabajado, pero en última instancia no parece haber un conflicto entre la adición de un botón de la extensión con «uno mismo» y no específicamente a decir más tarde que un botón está utilizando.

    De nuevo, probablemente básico, pero nuevo para mí, así que pensé que valía la pena compartir.

  10. 0

    Otro truco

    @IBOutlet private weak var button: UIButton! {
        didSet {
            button.setTitle(title, for: .normal)
        }
    }
    

    Esto funciona sólo si se conoce el valor del título, sin hacer llamadas a la API. El botón del título aparecerá antes de que el se carga la vista para no ver la animación

Dejar respuesta

Please enter your comment!
Please enter your name here