如何在表视图标题视图中使用UISegmentedControl自动调整UIView

时间:2015-09-18 13:39:23

标签: swift uitableview uisegmentedcontrol

当我创建UISegmentedControl并将其设置为表格视图的标题视图而不为其指定任何框架时,控件会自动调整大小以跨越表格视图的宽度并保持其固有高度。

let control = UISegmentedControl(items: ["one", "two"])
tableView.tableHeaderView = control

simulator screenshot with segmented control properly sized

但是,当我将分段控件包装在另一个UIView中时,视图会折叠并且未正确调整大小。

let header = UIView()
let control = UISegmentedControl(items: ["one", "two"])
header.addSubview(control)
tableView.tableHeaderView = header

simulator screenshot with segmented control improperly sized

如何使UIView的行为方式与UISegmentedControl相同?在初始配置方面,我无法找到两者之间的任何差异。

1 个答案:

答案 0 :(得分:4)

在这里回答自己。我发现用一个任意宽度和所需高度的帧初始化视图,然后使用autolayout使分段控件跨越视图就行了。

let header = UIView(frame: CGRectMake(0, 0, 1, 33))
let control = UISegmentedControl(items: ["one", "two"])
control.translatesAutoresizingMaskIntoConstraints = false
header.addSubview(control)
header.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[control]|", options: [], metrics: nil, views: ["control": control]))
header.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[control]|", options: [], metrics: nil, views: ["control": control]))
tableView.tableHeaderView = header

似乎忽略了框架的宽度,并且标题视图始终调整为表格视图的宽度。但是,必须设置专用高度。

我猜是

UISegmentedControl(items: ["one", "two"])

使用默认框架在内部调用init(frame:),启用此机制。另一方面,

UIView()

显然使用init(frame:)调用CGRectZero,这会使标题崩溃。