236 votes

Comment arrêter l'animation indésirable d'un bouton UIButton lors d'un changement de titre ?

Dans iOS 7, les titres de mes UIButton s'animent au mauvais moment - en retard. Ce problème n'apparaît pas sous iOS 6. J'utilise simplement :

[self setTitle:text forState:UIControlStateNormal];

Je préférerais que cela se produise instantanément et sans cadre vide. Ce clignotement est particulièrement gênant et détourne l'attention des autres animations.

0 votes

Nous rencontrons également ce problème. Nous ne sommes pas sûrs qu'il s'agisse d'un bug d'iOS7 ou de quelque chose que nous devrions corriger.

0 votes

Essayez, [self.button setHighlighted:NO] ;

0 votes

Merci pour ces idées. J'ai essayé setHighlighted:NO, mais sans succès. Je parviens à réduire le clignotement en plaçant setTitle à l'intérieur de : [UIView animateWithDuration:0.0f animations:^{ ... }] ;

285voto

moby Points 6711

Utiliser le performWithoutAnimation: et de forcer la mise en page à se produire immédiatement plutôt que plus tard.

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

12 votes

Cela fonctionne aussi bien que la réponse acceptée, mais semble plus agréable parce que c'est plus encapsulé - il est impossible d'oublier d'ajouter le [UIView setAnimationsEnabled:YES], ou qu'il soit supprimé en cours de route.

21 votes

Cela fonctionne pour les boutons du système si vous appelez [button layoutIfNeeded]; à l'intérieur du bloc.

2 votes

BTW, pour les boutons du système, layoutIfNeed doit être appelé après texte modifié

169voto

Jacob K Points 625

Cela fonctionne pour les boutons personnalisés :

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

Pour les boutons système, vous devez ajouter ceci avant de réactiver les animations (merci @Klaas) :

[_button layoutIfNeeded];

0 votes

Cette solution élimine complètement le clignotement.

14 votes

Malheureusement, cela ne semble pas fonctionner. Il en va de même pour performWithoutAnimation

9 votes

Ok, donc la solution qui a fonctionné en fin de compte était de laisser le texte original de l'UIButton vide de sorte que lorsque je le définis avec du code, il ne déclenche pas l'animation.

61voto

shede333 Points 429

A noter :

quand " type de bouton "de _button est "UIButtonTypeSystem" Le code ci-dessous est invalide

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

quand " type de bouton "de _button est "UIButtonTypeCustom" Le code ci-dessus est valide .

0 votes

Je n'arrive pas à croire le temps que j'ai passé avant de comprendre qu'il suffit de changer le type de bouton... ugh...

1 votes

Fonctionne sans aucun code. Il suffit de changer le type de boutons pour qu'il fonctionne.

55voto

Norbert Points 1590

À partir d'iOS 7.1, la seule solution qui a fonctionné pour moi a été d'initialiser le bouton avec le type UIButtonTypeCustom .

0 votes

C'est l'approche la plus raisonnable pour tous ceux qui n'ont pas besoin de UIButtonTypeSystem.

0 votes

J'ai créé un bouton PERSONNALISÉ et je l'ai fait ressembler à un bouton du système. La différence est à peine perceptible, mais vous n'avez pas ce délai.

18voto

dubenko Points 101

J'ai donc trouvé une solution :

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

Dans un premier temps, nous modifions le titre du bouton, puis nous redimensionnons le bouton en fonction de ce titre.

1 votes

J'utilise la même solution. La réponse acceptée ne fonctionne pas pour moi.

0 votes

Le titre clignote alors deux fois, du moins sous iOS 8.

1 votes

Cela fonctionne pour moi dans les versions 7.1 et 8.1 sans clignotement. Simple et efficace.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X