How to resize a UISwitch?

IphoneCocoaCocoa Touch

Iphone Problem Overview


I have made a custom UISwitch (from this post). But the problem is, my custom texts are a bit long. Is there any way to resize the switch? [I tried setBounds, did not work]

Edit:

Here is the code I used:

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

Iphone Solutions


Solution 1 - Iphone

The simplest way is to resize it, as a view:

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

and you don't have to care about anything else!

Solution 2 - Iphone

Here is the swift 3 version of mxg answer:

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

Solution 3 - Iphone

Many controls are meant to be a specific size. If you were implementing this yourself, you would override setFrame:, adjust the frame parameter to match your control's required size, and then pass that to [super setFrame:].

If you subclass a control that has this behavior, there's really no way to override it because your subclass will inherit the superclass's implementation of setFrame:, which modifies your frame rectangle. And there's no way to set the frame of your control without calling [super setFrame:].

You'll most likely have to inherit from UIControl and implement the properties/behaviors you want from UISwitch manually to work around this.

Solution 4 - Iphone

UISwitch is not designed to be customized.

I think the your best solution is to download one of the custom switch implementations mentioned in the other question that you referred to. Either UICustomSwitch or RCSwitch. They both should be able to handle wide labels.

Solution 5 - Iphone

There is no option for resizing uiswitch in xib, so need to create and resize it in controller class,

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

Solution 6 - Iphone

If you want to resize switch put through the Storyboard or nib, You can subclass UISwitch and override awakeFromNib method:

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

Select the switch control and change it's class to your custom switch class.

enter image description here

Solution 7 - Iphone

Here is a solution 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];
}

Where varSettingsSwitchNewsletter_scale is an int from 0 to 100 (%).

Solution 8 - Iphone

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmshsayemView Question on Stackoverflow
Solution 1 - IphonemxgView Answer on Stackoverflow
Solution 2 - IphoneBeninho85View Answer on Stackoverflow
Solution 3 - IphoneAlexView Answer on Stackoverflow
Solution 4 - IphoneprogrmrView Answer on Stackoverflow
Solution 5 - IphonesabaView Answer on Stackoverflow
Solution 6 - IphonePrajeet ShresthaView Answer on Stackoverflow
Solution 7 - IphoneAl-Noor LadhaniView Answer on Stackoverflow
Solution 8 - IphoneArunaView Answer on Stackoverflow