web-dev-qa-db-fra.com

Comment redimensionner un UISwitch?

J'ai fait un UISwitch personnalisé (à partir de ce post) . Mais le problème est que mes textes personnalisés sont un peu longs. Est-il possible de redimensionner le commutateur? [J'ai essayé setBounds, n'a pas fonctionné]

Modifier:

Voici le code que j'ai utilisé:

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

Le moyen le plus simple est de le redimensionner, sous forme de vue:

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

et vous ne devez vous soucier de rien d'autre!

173
mxg

Voici la version Swift 3 de la réponse mxg:

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

De nombreux contrôles sont censés avoir une taille spécifique. Si vous l'implémentiez vous-même, vous surchargeriez setFrame:, ajusteriez le paramètre frame pour qu'il corresponde à la taille requise de votre contrôle, puis passeriez cela à [super setFrame:].

Si vous sous-classez un contrôle qui a ce comportement, il n'y a vraiment aucun moyen de le remplacer car votre sous-classe héritera de l'implémentation de setFrame: de la superclasse, ce qui modifiera le rectangle de votre cadre. Et il n’ya aucun moyen de définir le cadre de votre contrôle sans appeler [super setFrame:].

Vous devrez probablement hériter de UIControl et implémenter les propriétés/comportements souhaités de UISwitch manuellement pour résoudre ce problème.

7
Alex

UISwitch n'est pas conçu pour être personnalisé. 

Je pense que la meilleure solution consiste à télécharger l'une des implémentations de commutateurs personnalisés mentionnées dans l'autre question à laquelle vous avez fait référence. Soit UICustomSwitch ou RCSwitch . Ils devraient tous deux être capables de gérer des étiquettes larges.

4
progrmr

Il n'y a pas d'option pour redimensionner uiswitch dans xib, il faut donc le créer et le redimensionner dans la classe du contrôleur,

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

Si vous souhaitez redimensionner le commutateur inséré dans le Storyboard ou la nib, vous pouvez sous-classer UISwitch et remplacer la méthode awakeFromNib:

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

Sélectionnez le contrôle de commutateur et changez sa classe en votre classe de commutateur personnalisée.

 enter image description here

2
Prajeet Shrestha

Voici une solution en 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];
}

Où varSettingsSwitchNewsletter_scale est un entier de 0 à 100 (%).

1
Al-Noor Ladhani
// 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];
0
Aruna