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é à l'intérieur de viewDidLoad
self.segmentedControl.selectedIndex = 1;
J'ai le chose bizarre:
au lieu de:
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?
- Dois-je rassembler correctement que votre commande a l'air bien manuellement lorsque vous appuyez sur l'un des segments d'après votre point de vue a chargé? Ou est-il toujours le même aspect que dans la première image?
- Vous êtes de droite. Il ressemble à ceci la première fois que la classe est chargée et que la valeur est réglée manuellement. Puis plus tard dans l'application si l'utilisateur appuie sur l'un des segments, puis il a l'air bien. Aussi, si il y a deux sectorielle des contrôles et de l'utilisateur modifie la valeur de la première et j'ai modifier par programmation la valeur de la seconde en raison de la logique, alors il a l'air bien aussi. Je suis à l'aide de l'iOS 4.2 SDK sur Snow Leopard.
- Il semble que le contrôle est l'utilisation de la mauvaise diviseur image au démarrage (c'est à l'aide de l'un pour les non sélectionnés/désélectionner au lieu de la désactivée/activée). À quel moment exactement dans votre cycle de vie d'application sont vous du réglage de l'aspect de la UISegmentedControl?
- Je suis en train de l'apparence dans la méthode viewDidLoad
- J'ai utilisé moi-même avant sans problèmes. La segmentation du contrôle de la valeur a été chargé par programme au début de NSUserDefaults, mais je n'ai pas rencontré avant. Alors qu'il est possible qu'il y ait un bug dans le SDK, je pense qu'il y aurait beaucoup plus de gens avec ce problème dans ce cas. Cela peut aider si vous pouvez poster plus de code.
- Non testé: vous pouvez essayer de ne pas en avoir sélectionné pendant le chargement et ensuite, sur
viewWillAppear
, la "sélection" celui que vous voulez. - J'ai essayé ça aussi, et ça ne fonctionne pas!
- Je suis d'accord que ce doit être un bug. J'ai mis l'apparition dans didFinishLaunchingWithOptions et utilisé extensible images, mais je rencontre le même problème. J'ai essayé toutes les solutions ci-dessous, mais sans succès.
- Il semble exister une semblable (mais une autre) bug dans iOS 6. Lorsque la vue est chargée pour la première fois (si l'utilisation de deux segments) le point de vue trompé de diviseur de l'image jusqu'à ce que par programmation, vous passez à un autre segment et de retour à nouveau. Cela ne fonctionne pas si vous le faites dans viewWillAppear, mais il fonctionne si vous le faites dans viewDidAppear!
- Outre le commentaire ci-dessus ce problème apparaît lorsque le contrôle de l'état est défini sur désactivé.
- Je l'ai fait et il a bien fonctionné. Êtes-vous à l'aide de redimensionner les images? Je l'ai utilisé seul pixel de large, de redimensionner les images et cela a fonctionné sans aucun problème.
Vous devez vous connecter pour publier un commentaire.
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):
J'ai utilisé 3px à l'échelle des images pour les séparateurs et de 1px de large les images pour les décors.
Modifier:
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:
Sur mon exemple ci-dessus, de files d'attente que l'instruction qui fait que cela fonctionne très bien.
Je pense que votre image CapInsets est incorrect, veuillez le double de l'exemple dans http://www.raywenderlich.com/4344/user-interface-customization-in-ios-5
voici quelques codes du Tutoriel pour référence rapide:
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 cloison également.
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.
Avez-vous essayé de mettre de redimensionner les images?
Par exemple:
Vous pouvez essayer de l'initialisation de vos paramètres d'apparence plus tôt que
viewDidLoad
. Dans les manifestations que j'ai vu c'était fait habituellement dansapplication:didFinishLaunchingWithOptions:
, si n'importe quel moment avant le chargement de la plume contenant les vues personnalisées devrait fonctionner.J'ai eu le même problème et résolu d'une manière différente. J'ai juste commenté cette ligne de code:
Et le segment de la barre de changé-il à l'état normal.