В дополнение к ответу DexterW. Я пришел к тому же решению - подражать UISegmentedControl
, используя только UIButtons
.
Однако это не простая задача, чтобы имитировать UISegmentControl
. Я попытался использовать Selected
состояние UIButton
, но UIButton
не будет работать должным образом, если установить одинаковые настройки (bg image, color font) для состояний Hightlighted
и Selected
. В том случае, когда сегмент выглядит выделенным, он все еще визуально «нажимается». Итак, чтобы избежать этого и сделать набор кнопок более похожим на UISegmentedControl
, я вообще не использовал состояние selected
. Вместо этого Id решил изменить внешний вид выбранной кнопки в коде так, чтобы состояния normal
и highlighted
визуально были одинаковыми для выбранной кнопки и отличались для невыбранной.
Предположим, у меня есть 3 кнопки segmentedControl (LeftSgm | MiddleSgm | RightSgm), и для нормального состояния я использую изображение bg с именем «gment_default »и цвет шрифта белый, а для выбранного состояния его изображение bg с именем «gment_active» и черный шрифт. Так в 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
...
}
и вызываемый метод
-(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;
}
}
Все три кнопки привязаны в IB к соответствующим свойствам (btnRightSgm и т. Д.). Также для «события касания» связано onTopMenuTap.
Не могу сказать, что это лучшая идея, но она отлично работает для меня.