2010-09-09 10 views
5

üzerinde özel görüntülerle UISegmentedControl:iPhone: Bazı özel görüntülerle bir UISegmentedControl kullanıyorum preslenmiş halde

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]; 

Bu kısım gayet iyi çalışıyor. Ancak, hala Apple'ın kontrol için stilini kullanıyor ve sadece görüntüleri üzerine ekliyor. Apple'ın stillerini kullanmak zorunda kalmama ve conrolü kendi resimlerimle arka plan olmadan kişiselleştirmenin bir yolu var mı? Ayrıca kendi "seçilmiş" durum resimlerine sahip olmak isterim.

Mümkün mü?

cevap

3

Nic,

Bir süredir bu ile oynadıktan sonra, ben sadece bir şekilde "kendi roll" karar verdi.

Photoshop'ta bazı düğme resimleri yaptım ve bölümlere ayrılmış bir denetim gibi görünen her şeyi aldım. Ardından, tüm düğmelerin "seçilmiş" durumları için farklı bir görüntü ayarlıyorum. Bir düğmeye basıldığında, diğerlerine setSelected: NO denir. Sonra ne yapmam gerekiyorsa hallettim.

Diğer çözümleri duymayı çok isterim.

0

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 UIButtonHightlighted 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.

İlgili konular