在桌面视图中,快速拖尾约束不能按预期工作

问题描述:

我有一个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个象素的黑色图。但是当我跑步时,我甚至无法看到视图。它提供正确的解决方案

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 
    } 

在这种情况下

2)代码,我得到预期的解决方案。即来自顶部的黑色视图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边的超视图边缘。没有问题与此。

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

1)containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: 8)没有工作

2)containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: self.frame.width - 8)这并令人惊奇地工作。

+0

在你的情况2,如果你只使用-8为withOffset:是的结果一样吗? – 3stud1ant3

您正在将.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 
} 
+0

啊,这是因为scrollView和它的必要性有contentSize。不知何故,我从脑袋里滑了出来。感谢DonMag为您的时间。 –