uiswitch custom

本文介绍了一种修改UISwitch元素的方法,使其能够在不同语言环境中显示自定义的文本、字体及颜色。通过对UISwitch内部结构的深入解析,实现了在非英语环境下原本无法通过简单设置文本属性来更改的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.mobile-dev.de/iphone-code-schnipsel/34-iphone-user-interface/192-aendern-des-textes-von-uiswitch-elementen.html

 

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 umUILabels. 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 umUIImageView 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:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值