Personnaliser 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 façon suivante:

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

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

 self.segmentedControl.selectedIndex = 1; 

Je reçois la chose bizarre suivante:

entrez la description de l'image ici

au lieu de:

entrez la description de l'image ici

Est-ce que quelqu'un sait si c'est un bug et comment pourrais-je fournir un rapport de bogue? Sinon, qu'est-ce qui ne va pas avec mon code?

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

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

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

Après avoir cliqué sur l'user et en cliquant sur l'élément central: Après avoir cliqué sur l'utilisateur et en cliquant sur l'élément du milieu

J'ai utilisé des images larges 3px pour les séparateurs et des images larges 1px pour les arrière-plans.

Edit : Je pense avoir trouvé une solution de contournement: essayez de mettre en queue 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; }); 

Dans mon exemple ci-dessus, la mise en queue de cette instruction fait que tout fonctionne correctement.

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

Voici quelques codes du tutoriel pour une reference 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 barMesortingcs:UIBarMesortingcsDefault]; [[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMesortingcs:UIBarMesortingcsDefault]; [[UISegmentedControl appearance] setDividerImage:segmentUnselectedUnselected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMesortingcs:UIBarMesortingcsDefault]; [[UISegmentedControl appearance] setDividerImage:segmentSelectedUnselected forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMesortingcs:UIBarMesortingcsDefault]; [[UISegmentedControl appearance] setDividerImage:segUnselectedSelected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMesortingcs:UIBarMesortingcsDefault]; 

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

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

Premier point – nous devons faire la personnalisation de l'interface user avant de définir la largeur des segments individuels.

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

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é et parfait.

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 barMesortingcs:UIBarMesortingcsDefault]; 

Vous pouvez essayer d'initialiser vos parameters d'apparence plus tôt que viewDidLoad . Dans les démonstrations, j'ai vu que cela se faisait généralement dans l' application:didFinishLaunchingWithOptions: bien que tout point avant le chargement de la plume contenant les vues personnalisées devrait fonctionner.

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.