Swift尾随约束在tableview中无法正常工作

时间:2017-08-21 16:41:38

标签: ios swift uitableview nslayoutconstraint pure-layout

我使用函数定义UITableView扩展名,将默认视图放在tableView之上。由于某种原因,以下代码行无法按预期工作。

1)未提供正确解决方案的代码

func addNoDataView() -> UIView {
        let containerView = UIView(forAutoLayout: ())
        self.addSubview(containerView)
        containerView.backgroundColor = UIColor.black
        containerView.autoPinEdge(.leading, to: .leading, of: self, withOffset: 8)
        containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: 8)
        containerView.autoPinEdge(.top, to: .top, of: self, withOffset: 40)
        containerView.autoSetDimension(.height, toSize: 150)
        return containerView
}

在这种情况下,预期输出将是一个黑色视图,其中tableView顶部有40个像素,带有前导和尾随边距。但是当我跑步时,我甚至无法发现视图。

2)提供正确解决方案的代码

func addNoDataView() -> UIView {
            let containerView = UIView(forAutoLayout: ())
            containerView.backgroundColor = UIColor.black
            self.addSubview(containerView)
            containerView.autoPinEdge(.leading, to: .leading, of: self, withOffset: 8)
            containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: self.frame.width - 8)
            containerView.autoPinEdge(.top, to: .top, of: self, withOffset: 40)
            containerView.autoSetDimension(.height, toSize: 150)
            return containerView
    }

在这种情况下,我得到了预期的解决方案。即从顶部开始的黑色视图40,以及来自tableView的尾部和前缘的边距为8,高度为150。

我还有一个功能,几乎和上面一样,但差别很小(我认为)。

func addNoDataLabelToTableView() -> UILabel {
        let label = UILabel(forAutoLayout: ())
        self.addSubview(label)
        label.textColor = UIColor.darkGray
        label.textAlignment = .center
        label.text = "No Data Available"
        label.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: 8)
        label.autoPinEdge(.leading, to: .leading, of: self, withOffset: 8)
        label.autoSetDimension(.height, toSize: 20)
        label.autoCenterInSuperview()
        return label
    }

此函数将标签添加到tableView的中心,并按预期完美地运行。

tableView固定在所有4个边的超视图边缘。没问题。

但是,我无法理解为什么案例1不起作用。有人可以解释这两行之间的区别吗?

1)containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: 8)无效

2)containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: self.frame.width - 8) 确实令人惊讶。

1 个答案:

答案 0 :(得分:0)

您要将.containerView添加到UITableView ...继承自UIScrollView

滚动视图与约束的关系略有不同,因为它们也会确定滚动视图的.contentSize

如果确实想要将子视图添加到表格视图中(最好将其放在顶部,而不是在,但无论如何......),必须给该子视图一个宽度和高度(除非它像UILabel,它有一个固有的大小)。

因此,您需要将addNoDataView() func更改为:

func addNoDataView() -> UIView {
    let containerView = UIView(forAutoLayout: ())

    self.addSubview(containerView)
    containerView.backgroundColor = UIColor.black

    // inset view 8-pts from left
    containerView.autoPinEdge(.left, to: .left, of: self, withOffset: 8)

    // inset view 40-pts from top
    containerView.autoPinEdge(.top, to: .top, of: self, withOffset: 40)

    // set width to width of self (a scrollview) -16 (inset 8 from left and 8 from right)
    containerView.autoMatch(.width, to: .width, of: self, withOffset: -16.0)

    // set explicit height to 150
    containerView.autoSetDimension(.height, toSize: 150)

    return containerView
}