Home Code-Schnipsel User Interface Ändern des Textes von UISwitch Elementen

iPhone Gewinnspiel

Ändern des Textes von UISwitch Elementen PDF Drucken E-Mail
Share
Geschrieben von: Philipp   
FRIDAY, 20 FEBRUARY 2009 02:44
Erica Sadun hat in Ihrem Buch "The IPhone Developer's Cookbook: Building Native Applications for the IPhone" ein Beispiel beschrieben, welches den Text, die Schriftart und die Textfarbe von UISwitch Elementen ändert. Dieses Beispiel funktioniert soweit auch ganz gut, sofern das iPhone oder der iPod Touch in den Systemeinstellungen auf die englische Sprache eingestellt ist. In allen anderen nicht englischen Sprachen funktioniert ihr Beispiel nicht. Ich habe diese Beispiel nun so modifiziert, das es für alle Spracheinstellungen funktioniert.

Aber vorerst die Erklärung warum Ihr Beispiel nur im englischen einwandfrei läuft:

Ein UISwitch Element im englischen beinhaltet standardmäßig die Wörter "On" und "Off". Dabei handelt es sich im Endeffekt um UILabels. In allen nicht englischsprachigen UISwitch Elementen wird "On" und "Off" nicht einfach in die jeweilige Sprache übersetzt dargestellt, sonderen einfach durch "0" und "1" ersetzt. Dabei handelt es sich jetzt aber nicht mehr um UILabel Elemente sondern eben um UIImageView Objekte. Wenn nun Erica Sadun unbewust auf einem UIImage ein setText: aufruft führt das zwangsläufig zum Absturz. Folgende Bilder zeigen die Problematik nocheinmal kurz.

englisches UISwitch Element (mit UILabel) nicht englisches UISwitch Element (mit UIImageView)












Im folgenden Code habe ich dieses Problem abgefangen, in dem ich durch eine @try @catch Anweisung überprüfe ob es bei einem Aufruf von setText: auf einem UIImageView Objekt zu einem Absturz kommen könnte. Wenn dies der Fall wäre, fange ich diesen ab, "verstecke" das UIImageView Objekt und ersetze es durch ein neu generiertes UILabel, welches dann wieder im Text, der Schiftart und der Schriftfarbe beliebig angepasst werden kann. Das ganze wurde in eine neu erstellte Klasse namens UICustomSwitch verpackt.

// es wird die undokumentierte Methode setAlternateColors implementiert
// dadurch kann die Hintergrundfarbe von Blau auf Orange geändert werden

@interface UISwitch (extended)
- (void) setAlternateColors:(BOOL) boolean;
@end

// Legt _UISwitchSlider-Klasse offen
@interface _UISwitchSlider : UIView
@end

// Die Klasse für ein selbstgestalltetes UISwitch
@interface UICustomSwitch : UISwitch
- (void) setLeftLabelText:(NSString *)labelText
                     font:(UIFont*)labelFont
                    color: (UIColor *)labelColor;
- (void) setRightLabelText:(NSString *)labelText
                      font:(UIFont*)labelFont
                     color:(UIColor *)labelColor;
- (UILabel*) createLabelWithText:(NSString*)labelText
                            font:(UIFont*)labelFont
                           color:(UIColor*)labelColor;
@end


@implementation UICustomSwitch
- (_UISwitchSlider *) slider {
    return [[self subviews] lastObject];
}
- (UIView *) textHolder {
    return [[[self slider] subviews] objectAtIndex:2];
}
- (UILabel *) leftLabel {
    return [[[self textHolder] subviews] objectAtIndex:0];
}
- (UILabel *) rightLabel {
    return [[[self textHolder] subviews] objectAtIndex:1];
}

// Neues Label für nicht englische Versionen von UISwitch
- (UILabel*) createLabelWithText:(NSString*)labelText
                            font:(UIFont*)labelFont
                           color:(UIColor*)labelColor
{
    CGRect rect = CGRectMake(-25.0f, -10.0f, 50.0f, 20.0f);
    UILabel *label = [[UILabel alloc] initWithFrame: rect];
    label.text = labelText;
    label.font = labelFont;
    label.textColor = labelColor;
    label.textAlignment = UITextAlignmentCenter;
    label.backgroundColor = [UIColor clearColor];
   
    return label;
}

// setzt den linken Text im UICustomSwitch
- (void) setLeftLabelText:(NSString *)labelText
                     font:(UIFont*)labelFont
                    color:(UIColor *)labelColor
{
    @try {
        // fals englisch eingestellt ist
        [[self leftLabel] setText:labelText];
        [[self leftLabel] setFont:labelFont];
        [[self leftLabel] setTextColor:labelColor];
    } @catch (NSException *ex) {
        // nicht englische Versionen von UISwitch benutzen Images und kein Label
        // Das Image wird nicht dargestellt
        UIImageView* leftImage = (UIImageView*)[self leftLabel];
        leftImage.image = nil;
        leftImage.frame = CGRectMake(0.0f, 0.0f, 0.0f, 0.0f);
       
        // Dem Image wird als Unteransicht ein neues Label hinzugefügt
        [leftImage addSubview: [[self createLabelWithText:labelText
                                                     font:labelFont
                                                    color:labelColor] autorelease]];
    }
}

// setzt den rechten Text im UICustomSwitch
- (void) setRightLabelText:(NSString *)labelText font:(UIFont*)labelFont color:(UIColor *)labelColor {
    @try {
        // fals englisch eingestellt ist
        [[self rightLabel] setText:labelText];
        [[self rightLabel] setFont:labelFont];
        [[self rightLabel] setTextColor:labelColor];
    } @catch (NSException *ex) {
        // nicht englische Versionen von UISwitch benutzen Images und kein Label
        // Das Image wird nicht dargestellt
        UIImageView* rightImage = (UIImageView*)[self rightLabel];
        rightImage.image = nil;
        rightImage.frame = CGRectMake(0.0f, 0.0f, 0.0f, 0.0f);
       
        // Dem Image wird als Unteransicht ein neues Label hinzugefügt
        [rightImage addSubview: [[self createLabelWithText:labelText
                                                      font:labelFont
                                                     color:labelColor] autorelease]];   
    }
}
@end

Um dies nun auch nutzen zu können, müsstet Ihr nur an geeigneter Stelle (z.B. in loadView:) ein neues UICustomSwitch erstellen:
    // Standard UISwitch
    UICustomSwitch *switchView = [[UICustomSwitch alloc] initWithFrame:CGRectZero];
    [switchView setCenter:CGPointMake(160.0f,170.0f)];
    [self.view addSubview:switchView];
    [switchView release];
   
    // Folgender code zeigt wie mit setAlternateColors:YES
    // die Hintergrundfarbe auf Orange gesetzt werden kann

    switchView = [[UICustomSwitch alloc] initWithFrame:CGRectZero];
    [switchView setCenter:CGPointMake(160.0f,200.0f)];
    [switchView setAlternateColors:YES]; // bei Apple undokumentiert
    [self.view addSubview:switchView];
    [switchView release];
   
    // ein "Ja" - "Nein" UICustomSwitch
    switchView = [[UICustomSwitch alloc] initWithFrame:CGRectZero];
    [switchView setCenter:CGPointMake(160.0f,230.0f)];
    [switchView setLeftLabelText:@"JA"
                            font:[UIFont boldSystemFontOfSize: 17.0f]
                           color:[UIColor whiteColor]];
    [switchView setRightLabelText:@"NEIN"
                             font:[UIFont boldSystemFontOfSize: 17.0f]
                            color:[UIColor grayColor]];
    [self.view addSubview:switchView];
    [switchView release];
   
    // UICustomSwitch mit geänderter Schriftart und -farbe
    switchView = [[UICustomSwitch alloc] initWithFrame:CGRectZero];
    [switchView setCenter:CGPointMake(160.0f,260.0f)];
    [switchView setLeftLabelText:@"Foo"
                            font:[UIFont fontWithName:@"Georgia" size:16.0f]
                           color:[UIColor yellowColor]];
    [switchView setRightLabelText:@"Bar"
                             font:[UIFont fontWithName:@"Georgia" size:16.0f]
                            color:[UIColor blueColor]];
    [self.view addSubview:switchView];
    [switchView release];   
 

Hier nun dazu auch noch noch ein Beispielbild:

Kommentare (1)
App Store
1 THURSDAY, 15 OCTOBER 2009 11:23
???
wer hat Erfahrung mit dieser "undokumentierten" Veränderung vom UISwitch. Es steht ja ausdrücklich auf der Doku-Seite zum UISwitch: "The UISwitch class is not customizable." !

Geht so eine Modifikation durch den App Store, oder wird die App abgelehnt. Ich würde gerne "nur" die Hintergrundfarbe von einem UISwitch in meiner App ändern.

Ihren Kommentar hinzufügen

Ihr Name:
Ihre Webseite:
Betreff:
Kommentar:
  Bild, welches den Sicherheitscode enthält
Sicherheitscode:
LAST_UPDATED2