Dans iOS 7, mes titres UIButton s'animent au mauvais moment - tard. Ce problème n'apparaît pas sur 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 distrayant et détourne l'attention des autres animations.
self.button.titleLabel.text = text
. Mais cela ne redimensionne pas le cadre d'étiquette et ne fonctionne pas correctement avec UIControlStatesRéponses:
Cela fonctionne pour les boutons personnalisés:
Pour les boutons système, vous devez ajouter ceci avant de réactiver les animations (merci @Klaas):
la source
[_button layoutIfNeeded];
Utilisez la
performWithoutAnimation:
méthode, puis forcez la mise en page à se produire immédiatement au lieu de plus tard.la source
[button layoutIfNeeded];
à l'intérieur du bloc.Changez le type de bouton en générateur d'interface de formulaire personnalisé.
Cela a fonctionné pour moi.
la source
Dans Swift, vous pouvez utiliser:
la source
layoutIfNeeded()
le bouton est signalé comme devant être redessiné, mais cela ne se produira pas avant la prochaine passe de mise en page, qui sera en dehors deperformWithoutAnimation
Notez s'il vous plaît :
lorsque " buttonType " de _button est "UIButtonTypeSystem" , le code ci-dessous n'est pas valide :
lorsque " buttonType " de _button est "UIButtonTypeCustom" , le code ci-dessus est valide .
la source
À partir d'iOS 7.1, la seule solution qui fonctionnait pour moi était d'initialiser le bouton avec le type
UIButtonTypeCustom
.la source
donc je trouve une solution efficace:
au début, nous changeons le titre du bouton, puis redimensionnons le bouton pour ce titre
la source
Définissez le type de bouton sur UIButtonTypeCustom et il cessera de clignoter
la source
Swift 5
la source
J'ai fait une extension Swift pour ce faire:
Fonctionne pour moi sur iOS 8 et 9, avec
UIButtonTypeSystem
.(Le code est pour Swift 2, Swift 3 et Objective-C devrait être similaire)
la source
Définissez le type UIButton sur Personnalisé. Cela devrait supprimer les animations de fondu d'entrée et de sortie.
la source
Habituellement, le simple fait de définir le type de bouton sur Personnalisé fonctionne pour moi, mais pour d'autres raisons, je devais sous-classer UIButton et rétablir le type de bouton par défaut (Système), de sorte que le clignotement réapparaissait.
Le réglage
UIView.setAnimationsEnabled(false)
avant de changer le titre, puis la valeur true après cela n'a pas évité de clignoter pour moi, que j'appelleself.layoutIfNeeded()
ou non.Cela, et seulement cela dans l'ordre exact suivant, a fonctionné pour moi avec iOS 9 et 10 bêta:
1) Créez une sous-classe pour UIButton (n'oubliez pas de définir également la classe personnalisée pour le bouton dans le Storyboard).
2) Remplacez
setTitle:forState:
comme suit:Dans Interface Builder, vous pouvez laisser le type de bouton à Système, pas besoin de le changer en Type personnalisé pour que cette approche fonctionne.
J'espère que cela aide quelqu'un d'autre, j'ai lutté si longtemps avec les boutons clignotants ennuyeux que j'espère éviter aux autres;)
la source
layoutIfNeeded()
:]Vous pouvez simplement créer un bouton personnalisé et il cessera d'animer tout en changeant le titre.
vous pouvez également le faire dans la case Storyboard: sélectionnez le bouton dans le storyboard -> sélectionnez l'inspecteur d'attributs (quatrième à gauche) -> dans le menu déroulant 'Type', sélectionnez 'Personnalisé' au lieu de 'Système' qui a probablement été sélectionné .
Bonne chance!
la source
Vous pouvez supprimer les animations du calque de l'étiquette de titre:
la source
Version Swift 4 de la réponse de Xhacker Liu
la source
UIButton avec
system
type a une animation implicite activéesetTitle(_:for:)
. Vous pouvez le corriger de deux manières différentes:custom
, à partir du code ou d'Interface Builder:la source
J'ai trouvé que cette solution de contournement fonctionne également avec UIButtonTypeSystem mais ne fonctionnera que si le bouton est activé pour une raison quelconque.
Vous devrez donc les ajouter si vous avez besoin que le bouton soit désactivé lors de la définition de son titre.
(iOS 7, Xcode 5)
la source
[_button setTitle:@"title" forState:UIControlStateDisabled]
La combinaison des bonnes réponses ci-dessus entraîne la solution de contournement suivante pour UIButtonTypeSystem :
la source
J'ai eu le vilain problème d'animation lors de la modification des titres des boutons dans les contrôleurs de vue dans un UITabBarController. Les titres qui étaient initialement définis dans le story-board sont apparus pendant un court moment avant de disparaître dans leurs nouvelles valeurs.
Je voulais parcourir toutes les sous-vues et utiliser les titres des boutons comme clés pour obtenir leurs valeurs localisées avec NSLocalizedString, telles que;
J'ai découvert que ce qui déclenche l'animation est vraiment l'appel à btn.titleLabel.text. Donc, pour continuer à utiliser les storyboards et à localiser dynamiquement les composants comme celui-ci, je m'assure de définir l'ID de restauration de chaque bouton (dans Identity Inspector) sur le même que le titre et de l'utiliser comme clé au lieu du titre;
Pas idéal, mais fonctionne ..
la source
Vous pouvez réellement définir le titre en dehors d'un bloc d'animation, assurez-vous juste d'appeler à l'
layoutIfNeeded()
intérieur d'un performWithoutAnimation:Si vous avez un tas de boutons, pensez simplement à appeler
layoutIfNeeded()
la super vue:la source
L'extension Xhacker Liu convertie en Swift 3:
la source
Peut-être que générer 2 animations et 2 boutons est une meilleure solution, pour éviter le problème qui apparaît avec l'animation et la modification du texte d'un bouton?
J'ai créé un deuxième uibutton et généré 2 animations, cette solution fonctionne sans hickups.
la source
Je l'ai fait fonctionner avec une combinaison de réponses:
la source
Une extension pratique pour le changement de titre de bouton animé dans Swift qui joue bien avec l'implémentation par défaut:
la source
UIButton
.