以编程方式访问 UISwitch 大小而不添加组件

Posted

技术标签:

【中文标题】以编程方式访问 UISwitch 大小而不添加组件【英文标题】:Programmatically access UISwitch size without adding component 【发布时间】:2011-10-14 07:58:12 【问题描述】:

ios5 中,UISwitch 的宽度似乎已从 94px to 79px 更改。我使用该组件的宽度来计算如何向右,将其放置在 UITableViewCell 中。

有没有办法通过 iOS API 询问 UISwitch 的宽度是多少,而无需将其添加到视图中?

我目前的想法是保留我在定义中已经知道的两个宽度,然后检查 iOS 版本,if >=5 应该是 79px。但是,如果该组件的宽度在某个时候再次发生变化,那将无法正常工作。

【问题讨论】:

【参考方案1】:

是的,因为 UISwitch 是一个固定宽度的控件并设置和确定自己的大小,您可以简单地使用 CGRectZero 创建它,然后通过它的框架检查它的尺寸。这适用于 iOS4 和 iOS5。

在 iOS 4 上,宽度为 94 像素,在 iOS 5 上,宽度为 79 像素。你这样做:

UISwitch *mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
width = mySwitch.frame.size.width;

然后您可以使用宽度值在父视图中相应定位。通过在 UISwitch 框架上设置所需的 x,y 位置来做到这一点。

另外我建议您在 UISwitch 上设置 AutoResizingMask 边距值,以便无论设备方向或类型如何,它都保持在您放置的位置。

【讨论】:

或者为了将 UISwitch 定位在单元格中,您可以简单地将 Switch 添加为 AccessoryView。例如。 myTableViewCell.accessoryView = mySwitch.这样做的另一个好处是始终将其定位在右侧并正确处理其大小,而不管 iOS 版本如何。【参考方案2】:

快速解决方案:

let size = UISwitch.size()

有扩展名

private var switchSize: CGSize?
extension UISwitch 
  class func size() -> CGSize 
    if let size = switchSize 
      return size
     else 
      let view = UISwitch(frame: CGRectZero)
      switchSize = view.frame.size
      return view.frame.size
    
  

【讨论】:

【参考方案3】:

从 iOS 6.0 开始,您可以使用 intrinsicContentSize 获取 UISwitch 实例的自然大小。

【讨论】:

以上是关于以编程方式访问 UISwitch 大小而不添加组件的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 iPhone Setting Bundle 中以编程方式添加 UISwitch?

如何以编程方式切换uiswitch按钮

Swift:以编程方式添加视图时,UIScrollView 的可滚动内容大小不明确,而不使用 IB

从 IBAction 以编程方式设置 UISwitch isOn 再次调用 IBAction

需要时以编程方式添加滚动

以编程方式将代码添加到javascript函数