Comment définir UISegmentedControl Teinte de Couleur pour chaque segment
De commencer à apprendre Swift et suis en train d'essayer de convertir cette ObjectiveC code:
[[mySegmentedControl.subviews objectAtIndex:0] setTintColor:[UIColor blueColor]]
Ce définit correctement la teinte de la couleur du premier segment.
C'est le plus proche je suis arrivé à obtenir rapidement une version du même code:
mySegmentedControl?.subviews[0].tintColor = UIColor.blueColor()
L'erreur que j'obtiens est '@Ivalue $T9' is not identical to 'UIColor!!'
Je ne comprends pas ce que cette erreur signifie. Quand je regarde les .tintColor
méthode de la liste UIColor!?
et je n'ai pas trouvé ce que l' !?
ensemble, c'est rapide encore.
- Si mySegmentedControl un IBOutlet? Si elle l'est, de la déclarer @IBOutlet var mySegmentedControl = UISegmentedControl! Ensuite, vous n'avez pas besoin ? de l'opérateur. Qui ne permettent pas de résoudre l'ensemble du problème, mais c'est une chose. Si les sous-vues[0] peut retourner nil, alors c'est une option, donc peut-être mettre un ! après [0].
Vous devez vous connecter pour publier un commentaire.
Cela permettra de résoudre votre problème:
Vous pouvez également
La façon la plus simple que j'ai trouvé est:
Pour changer la nuance de couleur du segment sélectionné
Utiliser la valeur événement a changé pour le UISegmentControl de trier les segments dans l'ordre par leur origine valeur de x, puis la boucle et de comparer les selectedSegmentIndex de la propriété. Voici un exemple, en supposant une segmentation de contrôle de 4 segments:
Puis dans le viewDidLoad définir la nuance de couleur pour le premier segment sélectionné, dans ce cas, il est le premier:
Ce code fonctionne très bien avec la dernière version de Swift comme sur Mars 2017 (Swift 3.0)
Ici ce code que j'ai mis en place est l'extension pour le Segment de contrôle et peut être utilisé pour tous le segment des contrôles de l'application, où l'ensemble du code est défini dans la classe d'application.
Méthode d'Extension peut être utilisé directement dans l'application, vous pouvez également ajouter tous les paramètres, même de la méthode ou des méthodes différentes dans le prolongement de la classe, comme indiqué ci-dessous.
Partout pour les segments le code ci-dessous peut être utilisé
Après analyse et d'essayer beaucoup de réponses à ce type de questions, j'ai réalisé que, avec un 3e partie personnalisée segmenté de contrôle, il sera beaucoup plus facile et plus sûr de faire les personnalisations que d'essayer de pirater Apple UISegmentedControl.
Voici un exemple de personnalisation avec XMSegmentedControl (Swift 3).
Certains dans le code:
Et certains dans Interface Builder (peut être fait dans le code si vous le souhaitez):
Le résultat est:
Dans mon cas, il ressemble beaucoup à un système, mais il ya encore des différences mineures, j'ai eu à faire exactement ce que le concepteur a voulu qu'il soit.
Noter que XMSegmentedControl ne permet pas d'avoir des couleurs de fond différentes pour les différents segments, mais vous pouvez facilement ajouter cette si nécessaire, car il est simple .swift fichier, ce qui est très facile à comprendre et à modifier.
sender.subviews.sort
ne fonctionne pas dans Swift (4) et retirer la frontière est référencé sur Comment faire pour supprimer la frontière de commande segmentéeLa solution est uniquement pour les deux secteurs, mais il pourrait être facilement étendu à utiliser pour autant que de besoin.
Tout d'abord, je suggère de créer un enum:
Que d'en créer un d'une fonction, et d'appeler cette fonction dans le viewDidLoad, et aussi à chaque fois de l'appeler quand .valueChanged qui se passe dans segmentedControl:
Aussi, vous aurez besoin de changer diviseur image en conséquence:
Aussi, vous aurez besoin d'avoir une extension pour UIImage. Vous pouvez le trouver ici.