【问题标题】:Constraints on Child Container子容器的约束
【发布时间】:2020-11-18 10:02:08
【问题描述】:

我正在使用 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 像素。谢谢。

【问题讨论】:

  • 如果您要添加“heighAnchor”,请不要添加顶部和底部锚点。只需添加一个顶部锚点、底部锚点或将其居中。如果您添加顶部和底部,它可能会覆盖您现有的高度。
  • 您可以设置顶部和底部锚点其中之一和高度,但您不能设置全部三个。设置顶部和底部意味着高度。也许您想设置中心和高度?此外,除非您需要 RTL 语言环境中的特定布局,否则您应该使用前导/尾随而不是左/右
  • @Paulw11 我认为他正在使用高度,他没有明确定义,而是基于注释掉的约束,他指的是高度。但是,宽度的原理也相同。
  • 是的,我刚刚意识到并更新了我的评论
  • @xTwisteDx 你可以清楚地看到,topanchor 和bottom anchor 被注释掉了。所以我的问题仍然保持原样。

标签: ios swift view constraints childviews


【解决方案1】:

您的解决方案可能如下所示。

 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 具有非常严格的约束条件,不会有任何晦涩难懂的内容。

【讨论】:

  • 试过了,子view还是占350像素。
  • @coderq 你有没有对这个项目进行过自动布局?您是否有可能有冲突的约束,而不是在代码中?此解决方案应根据您提供的信息起作用。
猜你喜欢
  • 1970-01-01
  • 2019-06-05
  • 2011-02-12
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多