使用自动布局动态调整XIB根视图大小以适应其内容的大小

13

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

XIB with rootview and subview

我想要实现的是子视图具有固定大小,而根视图会自动调整为该子视图的大小,留出20.0的边距:

Resized XIB

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

Constraints View showing constraints

由于父视图没有任何约束条件,因此不应该存在歧义或冲突的约束条件:我希望父视图能够缩小以匹配约束条件。然而,Xcode会报错:

Warnings

这些约束只有在根视图具有固定大小的情况下才会产生冲突,而这似乎是事实。因此,我的问题是:如何使XIB的根视图灵活,以便它动态调整其大小以匹配其内容? (这在Interface Builder中是否可能?)

有任何人遇到这个问题,请不要担心。只需设置视图的正确大小即可抑制XIB错误。然后,当您创建视图时,它将自动调整大小以满足约束条件。 - kelin
4个回答

2
如何使XIB文件中的根视图具有灵活性,以便它动态调整其大小以匹配其内容?
在Interface Builder中不可能实现。
由于父视图没有任何约束条件,因此既没有歧义也没有冲突的约束条件。
它不仅是一个超级视图,还是nib中的一个对象。我们为这些视图定义模拟大小。这可以用来消除错误。但是这些只是模拟。
如果这个根视图是一个视图控制器的视图?如果是,我不明白为什么要将其宽度固定为280,高度固定为168。
如果这个视图是你要添加到另一个“父”视图中的自定义视图。然后,您应该将模拟大小更改为宽度280和高度168,并在将其作为子视图添加时,在“父”视图中添加两个额外的约束条件来定位此根视图。

问题是:根视图应该是一个表视图单元格,如果我想要使用自动布局,需要先让根视图适应约束,这样我才能从 tableView:heightForRowAtIndexPath: 方法中获取其框架高度返回。 - Mischa
如果您试图通过此方式获取单元格高度,那么您走错了方向。 - BangOperator
在您的意见中,什么是正确的方向? - Mischa
其实,我自己也使用过这个概念,我认为它与我在这里所做的事情基本相同:首先让单元格(自动)布局自身,然后检索其高度并在 tableView:heightForRowAtIndexPath: 方法中返回它。唯一的区别是,我试图让 XIB 的 根视图 自适应大小,而另一篇帖子建议只让单元格的 contentView 自适应大小。我仍然相信这是一个有效的问题,是否也可以对除了 UITableViewCells 之外的视图进行自动布局,因为这将使自动布局变得更加容易。 - Mischa
1
是的,这绝对是一个有效的问题!感谢您尝试其他方法。 - BangOperator
显示剩余3条评论

-1

我曾经遇到过同样的问题。我有一个在xib中的视图,其中包含动态内容,并且需要适应其他父视图。以下是我如何实现的答案:

首先,您需要使用myViewFromXib.translatesAutoresizingMaskIntoConstraints = false来防止将自动调整大小掩码转换为约束。然后添加子视图superViewForMyViewFromXib.addSubview(myViewFromXib)。然后,只需将约束添加到父视图中,如下所示:

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()

我期望父视图在匹配约束时缩小,就在界面构建器中应用约束时缩小,而不是在运行时。 - BangOperator

-2

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

  1. 为子视图添加一个高度约束
  2. 将xib文件以文本文件的形式打开
  3. 找到你添加的约束(例如通过Cmd-F查找到高度的值)
  4. 剪切并粘贴到根视图的约束部分
  5. 再次在界面构建器中打开xib文件
  6. 约束出现并且你可以像正常一样进行编辑。

-5

天啊,我简直不敢相信你会接受这是不可能的并改变你的方式,如果这是不可能的,那么Xib就毫无用处了。请不要向他人提供错误信息,你的问题很详细,但答案却非常糟糕:

答案非常简单:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接