A UISegmentedControl
a une nouvelle apparence dans iOS 13 et le code existant pour modifier les couleurs du contrôle segmenté ne fonctionne plus comme ils le faisaient.
Avant iOS 13, vous pouviez définir le tintColor
et qui serait utilisé pour la bordure autour du contrôle segmenté, les lignes entre les segments et la couleur d'arrière-plan du segment sélectionné. Ensuite, vous pouvez changer la couleur des titres de chaque segment en utilisant l'attribut de couleur de premier plan avec titleTextAttributes
.
Sous iOS 13, le tintColor
ne fait rien. Vous pouvez définir le contrôle segmenté backgroundColor
pour changer la couleur globale du contrôle segmenté. Mais je ne trouve aucun moyen de modifier la couleur utilisée comme arrière-plan du segment sélectionné. La définition des attributs de texte fonctionne toujours. J'ai même essayé de définir la couleur d'arrière-plan du titre, mais cela n'affecte que l'arrière-plan du titre, pas le reste de la couleur d'arrière-plan du segment sélectionné.
En bref, comment modifier la couleur d'arrière-plan du segment actuellement sélectionné d'un UISegmentedControl
dans iOS 13? Existe-t-il une solution appropriée, utilisant des API publiques, qui ne nécessite pas de creuser dans la structure de sous-vue privée?
Il n'y a pas de nouvelles propriétés dans iOS 13 pour UISegmentedControl
ou UIControl
et aucune des modifications apportées UIView
n'est pertinente.
la source
tintColor
ce qui est déjà couvert dans la réponse.À partir de Xcode 11 beta 3
Voir la réponse de rmaddy
Pour récupérer l'apparence d'iOS 12
Je n'ai pas pu teinter la couleur du segment sélectionné, j'espère qu'il sera corrigé dans une prochaine version bêta.
La définition de l'image d'arrière-plan de l'état sélectionné ne fonctionne pas sans la définition de l'image d'arrière-plan de l'état normal (qui supprime tout le style iOS 13)
Mais j'ai pu le ramener à l'apparence d'iOS 12 (ou assez près, je n'ai pas pu ramener le rayon de coin à sa plus petite taille).
Ce n'est pas idéal, mais un contrôle segmenté blanc brillant semble un peu déplacé dans notre application.
(Je n'avais pas réalisé qu'il
UIImage(color:)
s'agissait d'une méthode d'extension dans notre base de code. Mais le code pour l'implémenter se trouve sur le Web)la source
setTitleTextAttributes
pour que le titre du segment sélectionné ait une couleur blanche?Contrôle de segment IOS 13 et Swift 5.0 (Xcode 11.0) 100% fonctionnel
la source
J'ai essayé la solution de contournement et cela fonctionne très bien pour moi. Voici la version Objective-C:
la source
CGRectMake(0.0f, 0.0f, 1.0f, 1.0f)
: de mes tests avec Xcode 11 beta,rect
devait être de la même taille que les limites du contrôle segmenté.[[UISegmentedControl appearance] ensureiOS12Style]
j'obtiens une exception. Une idée de ce qui se passe?Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSMethodSignature getArgumentTypeAtIndex:]: index (2) out of bounds [0, 1]'
À partir de Xcode 11 beta 3
Merci @rmaddy!
Réponse originale, pour Xcode 11 beta et beta 2
Avec Xcode 11.0 bêta, cela semble être un défi de le faire par les règles, car cela nécessite essentiellement de redessiner toutes les images d'arrière-plan pour chaque état par vous-même, avec des coins arrondis, de la transparence et
resizableImage(withCapInsets:)
. Par exemple, vous devrez générer une image colorée similaire à:Donc pour l'instant, la manière de creuser dans les sous-vues semble beaucoup plus facile:
Cette solution appliquera correctement la couleur de teinte à la sélection, comme dans:
la source
setBackgroundImage
terminé.normal
, vous devez définir toutes les autres images (y compris les autres états etsetDividerImage
), probablement avec certainesUIBezierPath
etresizableImage(withCapInsets:)
, ce qui le rend trop complexe si nous voulons le design iOS 13 par ici.selectedSegmentTintColor
propriété surUISegmentedControl
.Réponse de la version Swift de @Ilahi Charfeddine:
la source
la source
iOS13 UISegmentController
comment utiliser:
la source
XCODE 11.1 et iOS 13
Basé sur la réponse de @Jigar Darji mais une mise en œuvre plus sûre.
Nous créons d'abord un initialiseur pratique disponible:
Ensuite, nous étendons UISegmentedControl:
la source
Voici mon point de vue sur la réponse de Jonathan pour Xamarin.iOS (C #), mais avec des correctifs pour le dimensionnement de l'image. Comme pour le commentaire de Cœur sur la réponse de Colin Blake, j'ai fait toutes les images sauf le diviseur de la taille du contrôle segmenté. Le diviseur est 1xhauteur du segment.
la source
Vous pouvez implémenter la méthode suivante
Code d'utilisation
la source
Bien que les réponses ci-dessus soient excellentes, la plupart d'entre elles ont une mauvaise couleur du texte à l'intérieur du segment sélectionné. J'ai créé une
UISegmentedControl
sous-classe que vous pouvez utiliser sur les appareils iOS 13 et pré-iOS 13 et utiliser la propriété tintColor comme vous le feriez sur les appareils pré-iOS 13.En utilisant la
tintColorDidChange
méthode, nous nous assurons que lastylize
méthode sera appelée chaque fois que latintColor
propriété change sur la vue de segment, ou sur l'une des vues sous-jacentes, ce qui est le comportement préféré sur iOS.Résultat:
la source
Développez un peu la réponse de Jonathan au cas où vous ne voudriez pas de coins arrondis
la source