DexterW'ın cevabına ek olarak. Ben de aynı karara vardım - sadece UIButtons
kullanarak UISegmentedControl
'u taklit etmek.
Ancak, UISegmentControl
taklit etmek için basit bir görev değil. UIButton
'un Selected
durumunu kullanmayı denedim ancak UIButton
Hightlighted
ve Selected
durumları için aynı ayarları (bg resmi, yazı tipi rengi) ayarlanmışsa beklendiği gibi çalışmaz. Böyle bir durumda segment görününce görsel olarak hala "basılabilir". Bundan kaçınmak ve UISegmentedControl
gibi daha etkili davranmak için düğmeler yapmak için selected
durumunu kullanmadım. Bunun yerine, Kimlikte seçilen butonun görünümünü değiştirmeye karar vermiştir, böylece normal
ve highlighted
durumları görsel olarak seçilen düğme için aynıdır ve seçili olmayan için farklıdır.
3 düğmeli segmentedControl (LeftSgm | MiddleSgm | RightSgm) ve normal durum için "segment_default" adlı bg resmi ve font rengi beyazı ve seçili durumunu "segment_active" ve siyah font olarak adlandırdığım bg resmim var. (BtnRightSgm vb)
-(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
...
}
ve denilen yöntem Her üç düğme özelliklerini karşılık gelen IB bağlı
-(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;
}
}
geçerli: onTouchDown Yani. Ayrıca "dokunma olayı" onTopMenuTap'a bağlı.
En iyi fikir olduğunu söyleyeyim ama benim için mükemmel çalışıyor.