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:
Au Lieu de:
, 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?
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 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.
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];
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.
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];
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.
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.