2010-01-01 9 views
9

Ma question tourne autour de la distinction entre un UISegmentedController sur un UINavigationBar et un UIToolbar. Si je dépose un UISegmentedControl dans une barre de navigation comme suit:Couleur UISegmentedControl dans un UIToolbar

navigationBar.barStyle = UIBarStyleBlackTranslucent; 

tout va bien. UISegmentedControl identifie l'option sélectionnée avec un noir légèrement plus foncé. Mais, si je dépose un UISegmentedControl sur un UIToolbar, il ne capte pas la couleur ou la translucidité de la barre d'outils. Si je règle manuellement la tintColor, le UISegmentedControl ne fait plus la distinction entre sélectionné et non sélectionné.

Certes, il faut envelopper le UISegmentedControl dans un UIBarButtonItem avant de tomber sur un UIToolbar. Je me demande si cela fait partie de la raison pour laquelle UISegmentedControl semble incorrect (bleu sur fond noir translucide).

toolbar.barStyle = UIBarStyleBlackTranslucent; 
UIBarButtonItem *item = [[[UIBarButtonItem alloc] initWithCustomView:segmentedControl]; 
NSArray *toolbarItems = [[NSArray alloc] initWithObjects:item,nil]; 
toolbar.items = toolbarItems; 

Attribuées, mon code n'est pas EXACTEMENT comme écrit depuis que je suis en utilisant la navigation intérieure et barre d'outils de commande, mais la logique générale est la même. Je ne suis pas sûr comment faire le UISegmentedControl sur l'UIToolbar avoir un style translucide noir - maintenir une distinction évidente entre les segments sélectionnés et non sélectionnés.

+0

Cela aide: 'segmentedController.tintColor = [UIColor darkGrayColor];' mais cela crée une dépendance codée en dur que je préférerais ne pas introduire. Par exemple, le rendre un peu plus compliqué pour permettre à l'utilisateur de sélectionner des schémas de couleurs. –

+0

L'avez-vous compris? – DenNukem

+0

Jusqu'à ce qu'Apple implémente la logique de coloration UINavigation dans l'UIToolbar pour UISegmentedControl, j'ai été relégué pour utiliser la propriété tintColor. –

Répondre

7

On dirait: segmentedController.tintColor = [UIColor darkGrayColor]; résout votre problème.

Pour supprimer la "dépendance", sous-classez UISegmentedControl et définissez la teinte dans le constructeur.

CustomSegmentedControl.m

- (id)initWithItems:(NSArray*)items { 
    if(self = [super initWithItems:items]) { 
     self.tintColor = [UIColor darkGrayColor]; 
    } 
    return self; 
} 
+0

Je pense que vous ne faites que déplacer la dépendance, ne pas vous en débarrasser. Par exemple, si je change la couleur de la barre d'outils en "vert" - je devrais aller trouver chaque ligne de code comme ceci et la changer. Je préfère ne pas configurer mon application comme ça. Je veux que la barre segmentée soit automatiquement alimentée par son parent. En effet, il le fait automatiquement lorsqu'il est placé dans un UINavigationController. Si vous modifiez le style UNavigationBar en noir translucide, n'importe quel enfant UISegmentedController suit automatiquement la suite. –

+0

Malheureusement, lorsqu'un UISegmentedControl est placé à l'intérieur d'un UIToolbar, il ne reflète pas automatiquement l'option style/color de la barre d'outils et, comme vous l'avez illustré, je dois explicitement lui dire de quelle couleur il s'agit. Dans cet exemple, j'identifie cela comme une "dépendance" et je cherche une solution qui n'introduise pas ce type de dépendance. Je ne veux pas définir la couleur à plusieurs endroits. –

+0

Étant donné qu'il s'agit d'une sous-classe, la couleur n'apparaît qu'une seule fois dans votre code. C'est une caractéristique de la conception orientée objet. Vous pouvez avoir 100 instances CustomSegmentedControl dans votre application, mais la couleur n'est indiquée qu'une seule fois. – bentford