2010-06-01 19 views
41

Ich habe eine custom UISwitch (from this post) gemacht. Aber das Problem ist, meine benutzerdefinierten Texte sind ein bisschen lang. Gibt es eine Möglichkeit, die Größe des Schalters zu ändern? [Ich habe versucht, setBounds, hat nicht funktioniert]Wie ändere ich die Größe eines UISwitch?

Edit:

Hier ist der Code I verwendet:

@interface CustomUISwitch : UISwitch  
- (void) setLeftLabelText: (NSString *) labelText; 
- (void) setRightLabelText: (NSString *) labelText;  
@end 

@implementation CustomUISwitch 

- (UIView *) 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]; 
} 
- (void) setLeftLabelText: (NSString *) labelText 
{ 
    [[self leftLabel] setText:labelText]; 
} 
- (void) setRightLabelText: (NSString *) labelText 
{ 
    [[self rightLabel] setText:labelText]; 
} 
@end 

mySwitch = [[CustomUISwitch alloc] initWithFrame:CGRectZero]; 

//Tried these, but did not work 
//CGRect aFrame = mySwitch.frame; 
//aFrame.size.width = 200; 
//aFrame.size.height = 100; 
//mySwitch.frame = aFrame; 

[mySwitch setLeftLabelText: @"longValue1"]; 
[mySwitch setRightLabelText: @"longValue2"]; 
+0

Verwenden Sie UISwitch (von der fotografierten Person) oder UICustomSwitch (von Ihrem Link)? Die Klasse [UICustomSwitch] (http://www.catamount.com/blog/?p=1063) ist eigentlich ein UISlider. – progrmr

+0

aber er erbt UISwitch, wie kann es ein Schieberegler sein? – mshsayem

+0

UICustomSwitch erbt von UISlider. Welchen benutzen Sie? Ihr Code sagt CustomUISwitch, Ihr Betreff sagt UISwitch, aber der Link, den Sie angegeben haben, weist auf eine UICustomSwitch-Implementierung hin. Wir können deine Frage nicht gut beantworten, wenn du nicht sagst, welche der 3 du wirklich meintest! – progrmr

Antwort

162

Der einfachste Weg ist es, um die Größe, als Ansicht:

UISwitch *mySwitch = [[UISwitch alloc] init]; 
mySwitch.transform = CGAffineTransformMakeScale(0.75, 0.75); 

und Sie haben nicht anderes über irgendetwas zu kümmern!

+4

Dies ist die einfachste und sauberste Lösung! +1 –

+0

Funktioniert aber nicht? – KaiserJohaan

+1

Problem ist, dass wenn wir dies tun, es pixelate den Schalter ... Irgendein anderer Weg? – TheTiger

7

Viele Kontrollen eine bestimmte Größe sein sollen. Wenn Sie dies selbst implementieren würden, überschreiben Sie setFrame:, passen Sie den Rahmenparameter an die erforderliche Größe Ihres Steuerelements an, und übergeben Sie dann das an .

Wenn Sie ein Steuerelement mit diesem Verhalten unterklassifizieren, gibt es keine Möglichkeit, es zu überschreiben, da Ihre Unterklasse die Implementierung der Superklasse setFrame: erbt, die Ihr Rahmenrechteck ändert. Und es gibt keine Möglichkeit, den Rahmen des Steuerelements festzulegen, ohne [super setFrame:] aufzurufen.

Sie müssen wahrscheinlich von UIControl erben und die gewünschten Eigenschaften/Verhaltensweisen von UISwitch manuell implementieren, um dies zu umgehen.

+0

Ich dachte so ... – mshsayem

+1

Bestätigt. Ging zu UISwitch.h ... es hat diesen Kommentar in initWithFrame: "// Diese Klasse erzwingt eine Größe, die für das Steuerelement geeignet ist. Die Rahmengröße wird ignoriert." – mshsayem

3

UISwitch kann nicht angepasst werden.

Ich denke, die beste Lösung ist, eine der benutzerdefinierten Switch-Implementierungen herunterzuladen, die in der anderen Frage erwähnt wurden, auf die Sie sich bezogen haben. Entweder UICustomSwitch oder RCSwitch. Beide sollten in der Lage sein, breite Etiketten zu verarbeiten.

+0

Ich habe UICustomSwitch hier ... aber kann nicht die Größe ändern ... lange Etiketten werden gewickelt .. RCSwitch funktioniert .. danke – mshsayem

3

Es gibt keine Option zum Ändern der Größe UISwitch in xib, so müssen sie in Controller-Klasse erstellen und die Größe,

 UISwitch *onoff = [[UISwitch alloc] initWithFrame: CGRectMake(0, 0, 10, 10)]; 
    onoff.transform = CGAffineTransformMakeScale(0.50, 0.50); 
    [self.view addSubview:onoff]; 
1

Hier ist eine Lösung in Code:

UISwitch *mySwitchNewsletter = [[UISwitch alloc] initWithFrame: CGRectMake(varSettingsSwitchNewsletter_x, 
                      varSettingsSwitchNewsletter_y, 
                      varSettingsSwitchNewsletter_width, 
                      varSettingsSwitchNewsletter_height)]; 
if (mySwitchNewsletter != nil) { 

    [varCommerceSettingsView addSubview:mySwitchNewsletter]; 


    float mySwitchScaleFactor = (varSettingsSwitchNewsletter_scale/100.0); 


    CGFloat dX=mySwitchNewsletter.bounds.size.width/2, dY=mySwitchNewsletter.bounds.size.height/2; 
    mySwitchNewsletter.transform = CGAffineTransformTranslate(CGAffineTransformScale(CGAffineTransformMakeTranslation(-dX, -dY), mySwitchScaleFactor, mySwitchScaleFactor), dX, dY); 

    mySwitchNewsletter release]; 
} 

Wo varSettingsSwitchNewsletter_scale ein int von 0 bis 100 (%).

2

Wenn Sie Schalter durch das Storyboard oder Spitze setzen, um die Größe möchten, können Sie UISwitch Unterklasse und awakeFromNib Methode überschreiben:

- (void)awakeFromNib { 
    self.transform = CGAffineTransformMakeScale(0.75, 0.75); 
} 

Wählen Sie den Steuerschalter und seiner Klasse Schalter Klasse zu Ihrer benutzerdefinierten ändern.

enter image description here

0
// Just in case someone trying to hard code UISwitch in Xcode 6.4 the following is working 
// in .h 
@property UISwitch * onoff; 

// in .m 

self.onoff = [[UISwitch alloc] initWithFrame:CGRectMake(160, 40, 0, 0)]; 
_onoff.transform = CGAffineTransformMakeScale(0.50, 0.50); 
[self.view addSubview:self.onoff]; 
11

Hier ist die schnelle 3-Version von mxg Antwort:

let mySwitch = UISwitch() 
mySwitch.transform = CGAffineTransform(scaleX: 0.75, y: 0.75) 
Verwandte Themen