2010-09-09 3 views
5

Ich bin ein UISegmentedControl mit einigen benutzerdefinierten Verwendung der Bilder:iPhone: UISegmentedControl mit eigenen Bildern auf gedrückten Zustand

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

Dieses Teil funktioniert gut. Aber es verwendet immer noch Apples Styling für die Steuerung und fügt einfach meine Bilder hinzu. Gibt es eine Möglichkeit, dass ich die Styles von Apple nicht verwenden muss und die Steuerung mit meinen eigenen Bildern ohne Hintergrund anpassen kann? Ich möchte auch meine eigenen "ausgewählten" Zustandsbilder haben.

Möglich?

Antwort

3

Nic,

Nachdem mit diesem für eine Weile zu spielen, habe ich beschlossen, einfach in einer Art und Weise „meine eigene Rolle“.

Ich habe einige Schaltflächenbilder in Photoshop erstellt und alles sah wie eine segmentierte Kontrolle aus. Dann stelle ich ein anderes Bild für die "ausgewählten" Zustände aller Knöpfe ein. Wenn eine Taste gedrückt wurde, rief ich setSelected: NO zu den anderen an. Dann kümmerte ich mich um alles, was ich tun musste.

Ich würde gerne andere Lösungen hören.

0

Zusätzlich zu DexterWs Antwort. Ich war zu der gleichen Entscheidung gekommen - UISegmentedControl nur mit UIButtons nachzuahmen. Es ist jedoch keine einfache Aufgabe, UISegmentControl nachzuahmen. Ich habe versucht, Selected Zustand eines UIButton zu verwenden, aber UIButton funktioniert nicht wie erwartet, wenn dieselben Einstellungen (BG-Bild, Schriftfarbe) für Hightlighted und Selected Staaten festgelegt werden. In diesem Fall, wenn das Segment ausgewählt ist, ist es visuell noch "pressbar". Also, um es zu vermeiden und machen Schaltflächen setzen mehr wie UISegmentedControl Ich habe einen selected Zustand überhaupt nicht verwendet. Statt dessen entschied sich Id, das Aussehen der ausgewählten Schaltfläche im Code so zu ändern, dass die Zustände normal und highlighted für die ausgewählte Schaltfläche visuell und für die nicht ausgewählte identisch sind.
Angenommen, ich habe 3 Tasten segmentedControl (LeftSgm | MiddleSgm | RightSgm) und für den normalen Zustand Im mit bg Bild mit dem Namen "segment_default" und Schriftfarbe weiß und für ausgewählte State seine BG-Bild namens "segment_active" und schwarze Schrift. So 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 
... 
} 

und die aufgerufene Methode ist

-(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; 
    } 
} 

Alle drei Tasten in IB gebunden sind mit entsprechenden Eigenschaften (btnRightSgm usw.). Auch für "Touch Up Event" ist onTopMenuTap gebunden.
Kann nicht sagen, es ist eine beste Idee, aber es funktioniert perfekt für mich.

Verwandte Themen