0

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 和 8 作为来自 tableView 的尾部和前沿的边距,高度为 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 个边上都固定到它的 superview 边缘。没有问题。

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

1)containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: 8)这不起作用

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

4

1 回答 1

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
}
于 2017-08-21T19:13:29.683 回答