2010-09-09 19 views
5

J'utilise un UISegmentedControl avec quelques images personnalisées:iPhone: UISegmentedControl avec des images personnalisées sur l'état pressé

UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:nil]; 
[segmentedControl insertSegmentWithImage:[UIImage imageNamed:@"0.png"] atIndex:0 animated:NO]; 
[segmentedControl insertSegmentWithImage:[UIImage imageNamed:@"1.png"] atIndex:1 animated:NO]; 
[segmentedControl insertSegmentWithImage:[UIImage imageNamed:@"2.png"] atIndex:2 animated:NO]; 
segmentedControl.frame = CGRectMake(0, 0, 90, 30); 
[self.view addSubview:segmentedControl]; 
[segmentedControl release]; 

Cette partie fonctionne très bien. Mais, il utilise toujours le style d'Apple pour le contrôle et ajoute simplement mes images dessus. Est-il possible que je n'aie pas besoin d'utiliser les styles d'Apple, et personnaliser le conrol avec mes propres images sans arrière-plan? J'aimerais aussi avoir mes propres images d'état "sélectionnées".

Possible?

Répondre

3

Nic,

Après avoir joué avec pendant un certain temps, j'ai décidé de simplement « rouler mon propre » en quelque sorte. J'ai fait quelques images de bouton dans photoshop et tout a ressemblé à un contrôle segmenté. Ensuite, je définis une image différente pour les états "sélectionnés" de tous les boutons. Quand on appuyait sur un bouton, j'appelais setSelected: NO aux autres. Ensuite, j'ai géré tout ce que j'avais besoin de faire.

J'aimerais entendre d'autres solutions.

0

En plus de la réponse de DexterW. Je suis venu à la même décision - pour imiter UISegmentedControl en utilisant UIButtons seulement.
Cependant, ce n'est pas une tâche simple pour imiter UISegmentControl. J'ai essayé d'utiliser Selected état d'un UIButton mais UIButton ne fonctionnera pas comme prévu si défini les mêmes paramètres (image bg, couleur de police) pour les états Hightlighted et Selected. Dans ce cas, lorsque l'aspect du segment est sélectionné, il est toujours "pressable" visuellement. Donc, pour l'éviter et faire en sorte que les boutons agissent plus comme UISegmentedControl je n'ai pas du tout utilisé l'état selected. Au lieu de cela Id a décidé de changer l'apparence du bouton sélectionné dans le code afin que les états normal et highlighted soient les mêmes visuellement pour le bouton sélectionné et différent pour un non sélectionné. Supposons que j'ai 3 boutons segmentedControl (LeftSgm | MiddleSgm | RightSgm) et pour l'état normal Im utilisant l'image bg nommée "segment_default" et la couleur de police blanche et pour l'état sélectionné son image bg nommée "segment_active" et la police noire. Ainsi, dans OnTouchDown:

-(IBAction)onTopMenuTap:(id)sender 
{ 
    int newSelectedSegmentIndex; 
    if (sender == btnLeftSgm) 
     newSelectedSegmentIndex=0; 
    else if (sender == btnMiddleSgm) 
     newSelectedSegmentIndex=1; 
    else if (sender == btnRightSgm) 
     newSelectedSegmentIndex=2; 
    else 
     return; 

    NSLog(@"Tapped segment index %d while old one is %d",newSelectedSegmentIndex,selectedSegmentIndex); 

    if (newSelectedSegmentIndex==selectedSegmentIndex) 
     return; 

    [self handleSegmentAppearenace:newSelectedSegmentIndex]; 
//do whatever its need to be done 
... 
} 

et la méthode appelée est

-(void)handleSegmentAppearenace:(int)newSelectedSegmentIndex 
{ 
    if (selectedSegmentIndex==0){ 
     [btnLeftSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_default_left"] forState:UIControlStateNormal]; 
     [btnLeftSgm setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
     btnLeftSgm.highlighted = NO; 
    } 
    else if (selectedSegmentIndex==1){ 
     [btnMiddleSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_default_center"] forState:UIControlStateNormal]; 
     [btnMiddleSgm setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
     btnMiddleSgm.highlighted = NO; 
    } 
    else if (selectedSegmentIndex==2){ 
     [btnRightSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_default_right"] forState:UIControlStateNormal]; 
     [btnRightSgm setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
     btnRightSgm.highlighted = NO; 
    } 

    if (newSelectedSegmentIndex==0){ 
     [btnLeftSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_active_left"] forState:UIControlStateNormal]; 
     [btnLeftSgm setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 
     btnLeftSgm.highlighted = YES; 
    } 
    else if (newSelectedSegmentIndex==1){ 
     [btnMiddleSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_active_center"] forState:UIControlStateNormal]; 
     [btnMiddleSgm setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 
     btnMiddleSgm.highlighted = YES; 
    } 
    else if (newSelectedSegmentIndex==2){ 
     [btnRightSgm setBackgroundImage:[UIImage imageNamed:@"segmented_control_active_right"] forState:UIControlStateNormal]; 
     [btnRightSgm setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 
     btnRightSgm.highlighted = YES; 
    } 
} 

Les trois boutons sont liés à IB aux propriétés correspondantes (btnRightSgm etc.). Aussi pour "événement de retouche" onTopMenuTap est lié.
Cant dire que c'est une meilleure idée, mais cela fonctionne parfaitement pour moi.