カスタムUISwitch(この投稿から) を作成しました。しかし問題は、私のカスタムテキストが少し長いことです。スイッチのサイズを変更する方法はありますか? [setBounds
を試しましたが、動作しませんでした]
編集:
私が使用したコードは次のとおりです。
@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"];
最も簡単な方法は、ビューとしてサイズを変更することです:
UISwitch *mySwitch = [[UISwitch alloc] init];
mySwitch.transform = CGAffineTransformMakeScale(0.75, 0.75);
そして、あなたは他に何も気にする必要はありません!
Swift 3バージョンのmxg回答:
let mySwitch = UISwitch()
mySwitch.transform = CGAffineTransform(scaleX: 0.75, y: 0.75)
多くのコントロールは、特定のサイズにするためのものです。これを自分で実装する場合は、setFrame:
をオーバーライドし、フレームパラメーターをコントロールの必要なサイズに合わせて調整し、[super setFrame:]
に渡します。
この動作を持つコントロールをサブクラス化する場合、サブクラスはフレームレクタングルを変更するsetFrame:
のスーパークラスの実装を継承するため、実際にオーバーライドする方法はありません。また、[super setFrame:]
を呼び出さずにコントロールのフレームを設定する方法はありません。
ほとんどの場合、UIControl
を継承し、UISwitch
から必要なプロパティ/動作を手動で実装して、この問題を回避する必要があります。
UISwitchはカスタマイズするように設計されていません。
あなたの最善の解決策は、あなたが言及した他の質問で言及されたカスタムスイッチ実装の1つをダウンロードすることだと思います。 ICustomSwitch または RCSwitch のいずれか。どちらも幅の広いラベルを処理できる必要があります。
Xibにはuiswitchのサイズを変更するオプションがないため、コントローラークラスで作成およびサイズ変更する必要があります。
UISwitch *onoff = [[UISwitch alloc] initWithFrame: CGRectMake(0, 0, 10, 10)];
onoff.transform = CGAffineTransformMakeScale(0.50, 0.50);
[self.view addSubview:onoff];
コードのソリューションは次のとおりです。
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];
}
VarSettingsSwitchNewsletter_scaleは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];