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.