In aggiunta alla risposta di DexterW. Sono arrivato alla stessa decisione: imitare UISegmentedControl
usando solo UIButtons
.
Tuttavia non è un compito semplice da imitare UISegmentControl
. Ho provato a utilizzare lo stato Selected
di UIButton
ma lo UIButton
non funzionerà come previsto se si impostano le stesse impostazioni (immagine bg, colore carattere) per gli stati Hightlighted
e Selected
. In tal caso, quando il segmento appare selezionato, è ancora visivamente "pressabile". Quindi, per evitarlo e fare in modo che i pulsanti diventino più simili a UISegmentedControl
non ho usato affatto lo stato selected
. Invece Id ha deciso di modificare l'aspetto del pulsante selezionato nel codice in modo che gli stati normal
e highlighted
siano gli stessi visivamente per il pulsante selezionato e diversi per quello non selezionato.
Assumendo che ho 3 pulsanti segmentedControl (LeftSgm | MiddleSgm | RightSgm) e per lo stato normale Im utilizzando bg immagine denominata "segment_default" e colore del carattere bianco e per lo stato selezionato la sua immagine in bg denominata "segment_active" e carattere nero. Quindi, in 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
...
}
e il metodo chiamato è
-(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;
}
}
Tutti e tre i pulsanti sono tenuti in IB per immobili corrispondenti (btnRightSgm ecc). Anche per "evento di ritocco" onTopMenuTap è vincolato.
Non posso dire che sia una buona idea ma funziona perfettamente per me.