【问题标题】:How to resize a UISwitch?如何调整 UISwitch 的大小?
【发布时间】:2011-02-26 07:37:18
【问题描述】:

我做了一个custom UISwitch (from this post)。但问题是,我的自定义文本有点长。有没有办法调整开关的大小? [我试过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(来自您的主题)还是 UICustomSwitch(来自您的链接)? UICustomSwitch class 实际上是一个 UISlider。
  • 但是继承了UISwitch,怎么可能是滑块?
  • UICustomSwitch 继承自 UISlider。你用的是哪一个?您的代码说 CustomUISwitch,您的主题说 UISwitch,但是您给出的链接指向 UICustomSwitch 实现?我们无法很好地回答您的问题,除非您说出您的真正意思是哪三个!
  • 对不起,我已经添加了代码。

标签: iphone cocoa cocoa-touch


【解决方案1】:

许多控件都具有特定的大小。如果您自己实现此功能,您将覆盖 setFrame:,调整 frame 参数以匹配您的控件所需的大小,然后将其传递给 [super setFrame:]

如果您将具有此行为的控件子类化,则实际上无法覆盖它,因为您的子类将继承超类的setFrame: 实现,这会修改您的框架矩形。如果不调用[super setFrame:],就无法设置控件的框架。

您很可能必须从 UIControl 继承并手动实现您希望从 UISwitch 获得的属性/行为以解决此问题。

【讨论】:

  • 已确认。转到 UISwitch.h... 它在 initWithFrame 中有这样的注释:“// 此类强制执行适合控件的大小。框架大小被忽略。”
【解决方案2】:

UISwitch 不是为定制而设计的。

我认为您最好的解决方案是下载您提到的另一个问题中提到的自定义开关实现之一。 UICustomSwitchRCSwitch。它们都应该能够处理宽标签。

【讨论】:

  • 我在这里使用了 UICustomSwitch ......但无法调整它的大小......长标签被包裹起来...... RCSwitch 工作......谢谢
【解决方案3】:

最简单的方法是调整它的大小,作为一个视图:

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

你不必关心其他任何事情!

【讨论】:

  • 问题是当我们这样做时它会像素化开关......还有其他方式吗?
  • 这在 iOS 7 上有错误。当它关闭时你会看到一些额外的灰色。
  • 但效果看起来很糟糕
【解决方案4】:

xib中没有调整uiswitch大小的选项,所以需要在controller类中创建并调整大小,

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

【讨论】:

    【解决方案5】:

    这是代码中的解决方案:

    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 (%) 的整数。

    【讨论】:

      【解决方案6】:

      如果你想通过 Storyboard 或 nib 调整开关的大小,你可以继承 UISwitch 并覆盖 awakeFromNib 方法:

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

      选择开关控件并将其类更改为您的自定义开关类。

      【讨论】:

        【解决方案7】:
        // 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];
        

        【讨论】:

          【解决方案8】:

          这是 swift 3 版本的 mxg 答案:

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

          【讨论】:

            猜你喜欢
            • 2013-02-18
            • 2023-03-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-01
            • 1970-01-01
            • 2011-10-01
            相关资源
            最近更新 更多