views:

513

answers:

3

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"];
A: 

UISwitch is a subclass of UIView so it has frame and this must work.

CGRect aFrame = _mySwitch.frame;
aFrame.size.width = newWidth;
aFrame.size.height = newHeight;
_mySwitch.frame = aFrame;
Espuz
did not work, :-s... I have added the code.
mshsayem
Went to UISwitch.h... it has this comment in initWithFrame: "// This class enforces a size appropriate for the control. The frame size is ignored."
mshsayem
UISwitch has a frame and you can resize the frame, but it also has subviews and those are not autoresized. It is not meant to be resized.
progrmr
+1  A: 

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.

Alex
I Thought so...
mshsayem
Confirmed. Went to UISwitch.h... it has this comment in initWithFrame: "// This class enforces a size appropriate for the control. The frame size is ignored."
mshsayem
+1  A: 

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.

progrmr
I used UICustomSwitch here... but can't resize it... long labels become wrapped.. RCSwitch works.. thanks
mshsayem