Personnalisation de UISegmentedControl dans iOS 5

, Voici mon problème. Je personnalise un UISegmentedControl en définissant les images d'arrière-plan et de diviseur 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];

Quand j'essaie de faire le 1er segmenté sélectionné dans viewDidLoad

self.segmentedControl.selectedIndex = 1;

Je reçois la chose étrange suivante:

entrez la description de l'image ici

Au Lieu de:

entrez la description de l'image ici

, personne Ne sait si c'est un bug et comment pourrais-je fournir un rapport de bug? Sinon, quel pourrait être le problème avec mon code?

27
demandé sur yuji 2012-02-02 18:37:38

6 réponses

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

Même avec un UISegmentedControl droit très simple, c'est ce que je reçois (en utilisant Xcode 4.3.1, iOS 5.1):

Après le lancement et la sélection de l'élément central dans le code: Après avoir lancé et sélectionné l'élément central dans le code

Après que l'utilisateur ait cliqué et cliqué sur l'élément central: Après que l'utilisateur ait cliqué et cliqué sur l'élément central

J'ai utilisé des images 3px larges pour les séparateurs et des images 1px larges pour le fond.

Modifier : Je pense avoir trouvé une solution de contournement: essayez de mettre en file d'attente l'instruction pour sélectionner l'élément, plutôt que de l'exécuter dans viewDidLoad, comme ceci:

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

Sur mon exemple ci-dessus, mettre en file d'attente cette instruction le fait fonctionner très bien.

10
répondu Fernando Madruga 2012-03-15 09:47:11

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 une 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];
4
répondu flypig 2012-09-04 06:16:52

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

Votre problème provient du paramètre de largeur incorrect pour les segments.

Premier point - nous devons personnaliser L'interface utilisateur avant de définir la largeur des segments individuels.

Deuxième point - nous devons compter la largeur du(des) diviseur (s) et c'est très important. Lorsque nous faisons de la personnalisation, le(s) diviseur (s) fait partie des éléments UISegmentedControl. Le diviseur n'est pas une superposition. Nous devrions compter le largeur du diviseur également.

Troisième point-lorsque nous utilisons la méthode set width pour les segments, la largeur du segment n'a pas besoin d'inclure la largeur du diviseur.

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

1
répondu user403015 2012-02-06 02:33:58

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];
1
répondu Julien 2012-02-23 12:37:12

Vous pouvez essayer d'initialiser vos paramètres d'apparence avant viewDidLoad. Dans les démonstrations que j'ai vues, cela se faisait généralement dans application:didFinishLaunchingWithOptions:, bien que n'importe quel point avant le chargement de la plume contenant les vues personnalisées devrait fonctionner.

0
répondu Casey Fleser 2012-02-02 17:13:18

J'ai eu le même problème et l'ai résolu de manière différente. Je viens de commenter cette ligne de code:

self.pageController.segmentedControlStyle = UISegmentedControlStyleBar;

Et la barre de segment a changé la vue à l'état normal.

0
répondu Wert1go 2012-07-31 05:47:44