使用Autolayout动态地将XIB的根视图调整为其内容的大小

时间:2015-09-29 09:43:30

标签: xcode resize autolayout interface-builder constraints

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

XIB with rootview and subview

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

Resized XIB

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

Constraints View showing constraints

由于superview没有任何约束,因此既不应该有歧义也不应该有矛盾的约束:我希望superview缩小以匹配约束。但是,Xcode抱怨道:

Warnings

如果rootview具有固定大小并且看起来是这种情况,那么这些约束只会发生冲突。所以我的问题是:如何使XIB的rootview灵活,以便动态调整其大小以匹配其内容?

(甚至可以使用Interface Builder吗?)

4 个答案:

答案 0 :(得分:3)

  

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

不可能使用界面构建器。

  

由于superview没有任何约束,因此不应该   歧义和矛盾的约束

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

这个rootView是视图控制器视图吗?如果是,我不明白为什么你要把它的亮度修正为280,高度为168。

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

答案 1 :(得分:-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()

答案 2 :(得分:-2)

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

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

答案 3 :(得分:-2)

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

答案绝非易事:

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