1

我正在使用 View.addChild 方法添加子视图

包含视图显然是 350 像素。但是,子视图占用了包含视图的所有空间......所以我的想法是强制子视图小于其父视图......但我的代码不起作用。我可以告诉你,如果我取消注释这两行它几乎可以工作,但是子视图不会占据我想要的大小并且它会阻止其他元素。这是我的位置:

  child.view.translatesAutoresizingMaskIntoConstraints = false
  let safeArea = view.layoutMarginsGuide
  //child.view.topAnchor.constraint(equalTo: tableContainer.topAnchor).isActive = true
  // child.view.bottomAnchor.constraint(equalTo: tableContainer.bottomAnchor).isActive = true
        
  child.view.leftAnchor.constraint(equalTo: tableContainer.leftAnchor).isActive = true
  child.view.rightAnchor.constraint(equalTo: tableContainer.rightAnchor).isActive = true
  child.view.heightAnchor.constraint(equalToConstant: 250).isActive = true
        
  self.addChild(child)

让我说得很清楚,我的目标是让子视图达到 250 像素。谢谢你。

4

1 回答 1

0

您的解决方案可能看起来像这样。

 child.view.translatesAutoresizingMaskIntoConstraints = false
  let safeArea = view.layoutMarginsGuide
  
  //Your left and right anchors tell the compiler exactly how wide the view should be.
  //If you have it set to equal both then the view MUST be exactly the width of parent.      
  child.view.leftAnchor.constraint(equalTo: tableContainer.leftAnchor).isActive = true
  child.view.rightAnchor.constraint(equalTo: tableContainer.rightAnchor).isActive = true

  //Since you're defining your own height here you need to explicitly state where the 
  //view starts at. If you don't define a top, center, bottom or some other constraint
  //it's impossible to know where to put the view.
  child.view.heightAnchor.constraint(equalToConstant: 250).isActive = true
  child.view.topAnchor.constraint(equalTo: safeArea.topAnchor).isActive = true
        
  self.addChild(child)

这样做的原因是,在创建锚点时,您必须为所有视图都有一个 X 和 Y 锚点,即使在逻辑上也是如此。例如,如果您定义宽度为 100,高度为 100,您创建了一个正方形,但该正方形去哪里了?在该示例中,您没有 X 或 Y。但是,如果您使用左右锚定义宽度以匹配父视图,那么它仅通过左右锚就知道视图的宽度。相同的原理适用于顶部和底部锚。如果您定义了一个顶部和底部锚点,那么它将是视图的大小(假设您将它们设置为 equalTo)并且它将知道高度。

在您的实例中,您定义了 250 的高度,但它不知道从哪里开始。它是从顶部,中间,底部开始的,它没有线索,因为你没有设置它。IDE 非常具有约束力,并且没有任何晦涩难懂的内容。

于 2020-07-28T21:47:24.790 回答