【问题标题】:Dynamically resize a XIB's root view to the size of its contents with Autolayout使用 Autolayout 将 XIB 的根视图动态调整为其内容的大小
【发布时间】:2015-12-26 17:51:19
【问题描述】:

我在 Xcode 中创建一个 XIB 并添加一个简单视图作为子视图:

我想要实现的是子视图具有固定大小,并且根视图自动调整为该子视图的大小,并在其周围留出 20.0 的边距:

所以我为子视图添加了固定宽度和固定高度约束。然后我为 20.0 边距添加四个约束:

由于 superview 没有任何约束,因此不应该有歧义或冲突约束:我希望 superview 缩小以匹配约束。然而,Xcode 抱怨:

只有当 rootview 具有固定大小并且看起来确实如此时,这些约束才会发生冲突。所以我的问题是:如何使 XIB 的根视图灵活,以便动态调整其大小以匹配其内容?

(Interface Builder 甚至可以做到这一点吗?)

【问题讨论】:

  • 有这个问题的朋友请不要着急。要抑制 XIB 错误,只需设置适当的视图大小。然后,当您创建视图时,它会自动调整大小以满足约束。

标签: xcode resize autolayout interface-builder constraints


【解决方案1】:

如何使 XIB 的根视图灵活,使其动态 调整其大小以匹配其内容?

不可能的界面生成器。

由于 superview 没有任何约束,所以两者都不应该 歧义或冲突的约束

它不仅仅是一个超级视图。它也是笔尖中的一个对象。我们为此类视图定义模拟大小。这可以用来消除错误。但是这些只是模拟的。

这个 rootView 是视图控制器视图吗?如果是,我不明白你为什么要尝试将它的高度固定为 280 和高度为 168。

如果此视图是您要添加到另一个“父”视图的自定义视图。然后您应该将模拟大小更改为 280 和高度 168,并且在将其添加为子视图时,您需要再添加两个约束以将此根视图定位在“父”视图中。

【讨论】:

  • 问题是:根视图应该是一个表格视图单元格,如果我想将它与自动布局一起使用,我需要根视图首先适应约束,这样我才能获得框架的高度从tableView:heightForRowAtIndexPath: 方法返回。
  • 如果你想通过这个获取单元格高度。你走错方向了。
  • 那么您认为正确的方向是什么?
  • 好吧,我自己也实际使用过这个概念,我认为这与我在这里的方向几乎相同:首先尝试让单元格(自动)布局自己,然后检索它的高度和在tableView:heightForRowAtIndexPath: 方法中返回它。唯一的区别是我试图让 XIB 的 root view 自行调整大小,而另一篇文章建议只让单元格的 contentView 自行调整大小。我仍然认为这对于 UITableViewCells 以外的视图是否也可行是一个有效的问题,因为它会使自动布局很多更容易。
  • 是的,这绝对是一个有效的问题!为尝试其他方式而欢呼。
【解决方案2】:

我也有同样的问题。我在 xib 中有一个视图,它具有动态内容,需要适应其他超级视图。所以这是我如何实现的答案

首先你需要

myViewFromXib.translatesAutoresizingMaskIntoConstraints = false 防止将自动调整掩码转换为约束。然后添加子视图superViewForMyViewFromXib.addSubview(myViewFromXib)。只需将您的约束添加到 superview 中,如下所示:

NSLayoutConstraint.activate([
            (myViewFromXib.topAnchor.constraint(equalTo: superViewForMyViewFromXib.topAnchor, constant: 0))!,
            (myViewFromXib.bottomAnchor.constraint(equalTo: superViewForMyViewFromXib.bottomAnchor, constant: 0))!,
            (myViewFromXib.leadingAnchor.constraint(equalTo: superViewForMyViewFromXib.leadingAnchor, constant: 0))!,
            (myViewFromXib.trailingAnchor.constraint(equalTo: superViewForMyViewFromXib.trailingAnchor, constant: 0))!
            ])
superViewForMyViewFromXib.setNeedsLayout()

【讨论】:

  • “我希望超级视图缩小以匹配约束”。 OP 希望超级视图在界面构建器中缩小,就在他应用约束时,而不是在运行时。
【解决方案3】:

您可以通过手动编辑 xib 来做到这一点,例如设置高度约束(在我的情况下,设置最小高度是不等式):

  1. 为子视图添加高度约束
  2. 将 xib 作为文本文件打开
  3. 找到你添加的约束(例如通过 Cmd-F'ing 到高度的值)
  4. 剪切并粘贴到根视图的约束部分
  5. 再次在界面生成器中打开 xib
  6. 约束出现,您可以像往常一样对其进行编辑。

【讨论】:

    【解决方案4】:

    我的天啊,我不敢相信你接受这是不可能的并改变你的方式,如果这不可能,那么 Xib 将毫无用处。请不要向其他人提供错误信息,您的问题很详细,但答案很差:

    答案很简单:

            subview.frame.size.height = rootView.frame.size.height
            subview.frame.size.width = rootView.frame.size.width
    

    【讨论】:

      猜你喜欢
      • 2013-09-21
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 2018-01-14
      相关资源
      最近更新 更多