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"];
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!
Voici la version Swift 3 de la réponse mxg:
let mySwitch = UISwitch()
mySwitch.transform = CGAffineTransform(scaleX: 0.75, y: 0.75)
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.
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.
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];
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.
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 (%).
// 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];