uiswitch custom

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:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值