2010-09-09 22 views
5

Sto usando un UISegmentedControl con alcune immagini personalizzate:iPhone: UISegmentedControl con immagini personalizzate sullo stato premuto

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

Questa parte funziona bene. Ma usa ancora lo stile di Apple per il controllo e aggiunge solo le mie immagini su di esso. C'è un modo in cui non devo usare gli stili di Apple e personalizzare il controllo con le mie immagini senza sfondo? Mi piacerebbe anche avere le mie immagini di stato "selezionate".

Possibile?

risposta

3

Nic,

Dopo aver giocato con questo per un po ', ho deciso di semplicemente "rotolare il mio" in un certo senso.

Ho creato alcune immagini dei pulsanti in Photoshop e ho ottenuto tutto come un controllo segmentato. Quindi, ho impostato un'immagine diversa per gli stati "selezionati" di tutti i pulsanti. Quando è stato premuto un pulsante, ho chiamato setSelected: NO agli altri. Quindi, ho gestito tutto ciò che dovevo fare.

Mi piacerebbe sentire altre soluzioni.

0

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.

Problemi correlati