27 votes

Personnalisation de UISegmentedControl dans iOS 5

Voici mon problème. Je suis la personnalisation d'un UISegmentedControl par définir l'arrière-plan et diviseur images de la manière suivante:

[[UISegmentedControl appearance] setDividerImage:segmentUnselectedUnselected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setDividerImage:segmentSelectedUnselected forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setDividerImage:segUnselectedSelected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault];

[[UISegmentedControl appearance] setBackgroundImage:segmentUnselected forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];

Lorsque je tente de faire le 1er segmenté sélectionné dans viewDidLoad

self.segmentedControl.selectedIndex = 1;

J'ai le chose bizarre:

enter image description here

au lieu de:

enter image description here

Personne ne sait si c'est un bug et comment pourrais-je fournir un rapport de bug? Si non, quel est le problème avec mon code?

10voto

Fernando Madruga Points 1281

Après avoir fait quelques tests et d'essayer plusieurs emplacements différents pour la personnalisation, je crois que cela peut en effet être un bug.

Même avec un très simple UISegmentedControl, c'est ce que j'obtiens (en utilisant Xcode 4.3.1, iOS 5.1):

Après le lancement et la sélection au moyen de l'élément dans le code: After launching and selecting the middle element in code

Après que l'utilisateur a cliqué loin et clique à nouveau sur le milieu de l'élément: After user-clicked away and clicking back on middle element

J'ai utilisé 3px à l'échelle des images pour les séparateurs et de 1px de large les images pour les décors.

Edit: Je crois que j'ai trouvé une solution: essayer des files d'attente de l'instruction de sélection de l'élément, plutôt que de l'exécuter dans le viewDidLoad, comme ceci:

dispatch_async(dispatch_get_main_queue(),^{
   self.segmentedControl.selectedSegmentIndex = 1;
});

Sur mon exemple ci-dessus, de files d'attente que l'instruction qui fait que cela fonctionne très bien.

4voto

flypig Points 611

Je pense que votre image CapInsets est incorrecte, veuillez doubler l'exemple dans http://www.raywenderlich.com/4344/user-interface-customization-in-ios-5

voici quelques codes du tutoriel pour référence rapide:

 UIImage *segmentSelected = [[UIImage imageNamed:@"segcontrol_sel.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 15)];
UIImage *segmentUnselected = [[UIImage imageNamed:@"segcontrol_uns.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 15)];
UIImage *segmentSelectedUnselected = [UIImage imageNamed:@"segcontrol_sel-uns.png"];
UIImage *segUnselectedSelected = [UIImage imageNamed:@"segcontrol_uns-sel.png"];
UIImage *segmentUnselectedUnselected = [UIImage imageNamed:@"segcontrol_uns-uns.png"];

[[UISegmentedControl appearance] setBackgroundImage:segmentUnselected forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setDividerImage:segmentUnselectedUnselected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setDividerImage:segmentSelectedUnselected forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setDividerImage:segUnselectedSelected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
 

1voto

user403015 Points 2058

J'ai trouvé comment résoudre le problème après j'ai fait beaucoup d'expériences.

Votre problème est d'un mauvais réglage de la largeur pour les segments.

Premier point que nous devons faire, personnalisation de l'INTERFACE avant le réglage de la largeur de chacun des segments.

Deuxième point, nous avons besoin de compter la largeur de la cloison(s) et c'est très important. Quand nous faisons de la personnalisation, le diviseur(s) est une partie de la UISegmentedControl éléments. Le diviseur n'est pas une superposition. Il faut compter la largeur de la ligne de séparation aussi.

Troisième point: lorsque nous utilisons l'ensemble de la largeur de la méthode pour les segments, le segment de la largeur n'a pas besoin d'inclure le diviseur de largeur.

Si vous suivez les règles ci-dessus, vous obtiendrez un parfait personnalisé UISegmentedControl.

1voto

Julien Points 613

Avez-vous essayé de définir des images redimensionnables?

Par exemple:

 UIImage *segmentSelected = [[UIImage imageNamed:@"SegmentSelectedImage"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 5)];
[[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
 

0voto

somegeekintn Points 1536

Vous souhaiterez peut-être essayer d'initialiser vos paramètres d'apparence avant viewDidLoad . Dans les démonstrations que j'ai vues, cela se faisait généralement en application:didFinishLaunchingWithOptions: , bien que tout point avant le chargement de la plume contenant les vues personnalisées devrait fonctionner.

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