Ios 以编程方式设置约束的问题

Ios 以编程方式设置约束的问题,ios,swift,uitableview,autolayout,constraints,Ios,Swift,Uitableview,Autolayout,Constraints,我想在使用所有水平空间的UITableView的标题中放置一个UISegmentedControl 这是这样的: 我想使用所有空间,所以我想设置约束。我试过这个: func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { if section == 0 { let headerView = UIView(fra

我想在使用所有水平空间的
UITableView
的标题中放置一个
UISegmentedControl

这是这样的:

我想使用所有空间,所以我想设置约束。我试过这个:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
            if section == 0 {
                let headerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.width, height:
                    UITableViewAutomaticDimension))
                headerView.backgroundColor = UIColor.white

            segmentedControl.translatesAutoresizingMaskIntoConstraints = false
            var constraint = NSLayoutConstraint(item: segmentedControl, attribute: .leading, relatedBy: .equal, toItem: headerView, attribute: .leading, multiplier: 1, constant: 0)
            var constraint2 = NSLayoutConstraint(item: segmentedControl, attribute: .trailing, relatedBy: .equal, toItem: headerView, attribute: .trailing, multiplier: 1, constant: 0)
            NSLayoutConstraint.activate([constraint,constraint2])
            headerView.addSubview(segmentedControl)

            return headerView
        }
    }
但出现以下错误:


***由于未捕获的异常“NSGenericeException”而终止应用程序,原因:“无法使用锚激活约束,并且因为它们没有共同的祖先。”。约束或其锚定是否引用不同视图层次中的项?这是非法的。

在激活约束之前,您需要将
分段控件
添加到
标题视图

var constraint = NSLayoutConstraint(item: segmentedControl, attribute: .leading, relatedBy: .equal, toItem: headerView, attribute: .leading, multiplier: 1, constant: 0)
var constraint2 = NSLayoutConstraint(item: segmentedControl, attribute: .trailing, relatedBy: .equal, toItem: headerView, attribute: .trailing, multiplier: 1, constant: 0)
headerView.addSubview(segmentedControl)
NSLayoutConstraint.activate([constraint,constraint2])

在激活约束之前,需要将
分段控件
添加到
头视图

var constraint = NSLayoutConstraint(item: segmentedControl, attribute: .leading, relatedBy: .equal, toItem: headerView, attribute: .leading, multiplier: 1, constant: 0)
var constraint2 = NSLayoutConstraint(item: segmentedControl, attribute: .trailing, relatedBy: .equal, toItem: headerView, attribute: .trailing, multiplier: 1, constant: 0)
headerView.addSubview(segmentedControl)
NSLayoutConstraint.activate([constraint,constraint2])

将segmentedControl添加到视图之前,需要设置约束。您应该首先将其添加到视图中,然后设置其约束在将segmentedControl添加到视图之前,您正在设置约束。您应该首先将其添加到视图中,然后设置其约束。这是可行的。我会接受的。但是当我把
10
举个例子,拖拉保持在窗外<代码>let constraint2=NSLayoutConstraint(项:分段控件,属性:。尾部,相关者:。相等,toItem:headerView,属性:。尾部,乘数:1,常数:10)段的最大X=头的最大X+10,因此,如果在视图中需要它,它应该是-10,这就是约束最终转换为trailing=max x的方式。这是有效的。我会接受的。但是当我把
10
举个例子,拖拉保持在窗外
let constraint2=NSLayoutConstraint(项:分段控制,属性:。拖尾,相关者:。相等,toItem:headerView,属性:。拖尾,乘数:1,常数:10)
max X of segment=max X of header+10,因此如果需要在视图中,它应该是-10,这就是约束最终转换为拖尾=max X的方式