使用自动布局将 XIB 的根视图动态调整为其内容的大小
Dynamically resize a XIB's root view to the size of its contents with Autolayout
我在 Xcode 中创建了一个 XIB,并添加了一个简单的视图作为子视图:
我想实现的是子视图有一个固定的大小,根视图自动调整到该子视图的大小,并在其周围留出 20.0 的边距:
所以我给子视图添加了固定宽度和固定高度的约束。然后我为 20.0 边距添加四个约束:
由于 superview 没有任何约束,因此不应存在歧义或冲突约束:我希望 superview 缩小以匹配约束。但是,Xcode 抱怨:
这些约束只有在根视图具有固定大小并且看起来就是这种情况时才会发生冲突。所以我的问题是:如何使 XIB 的根视图灵活,以便它动态调整其大小以匹配其内容?
(使用 Interface Builder 甚至可能吗?)
How can I make the rootview of a XIB flexible so that it dynamically
adjusts its size to match its contents?
不可能的界面生成器。
As the superview does not have any constraints there should be neither
ambiguity nor conflicting constraints
它不仅仅是一个超级视图。它也是笔尖中的一个对象。我们为此类视图定义模拟大小。这可以用来消除错误。但同样,这些只是模拟的。
这个 rootView 是视图控制器视图吗?如果是,我不明白你为什么要将它的宽度固定为 280,将高度固定为 168。
如果此视图是您要添加到另一个 'parent' 视图的自定义视图。然后您应该将模拟大小更改为 280 和高度 168,并且在将其添加为子视图时您需要添加两个约束以将此根视图定位在 'parent' 视图中。
您可以通过手动编辑 xib 来完成此操作,例如设置高度限制(在我的例子中,设置最小高度是不等式):
- 为高度的子视图添加约束
- 将 xib 作为文本文件打开
- 找到您添加的约束(例如通过 Cmd-F'ing 到高度值)
- 将其剪切并粘贴到根视图的约束部分
- 再次在界面生成器中打开 xib
- 约束出现,您可以正常编辑它。
天哪,我不敢相信你接受了这是不可能的并改变了你的方式,如果这是不可能的那么 Xib 将毫无用处。请不要向其他人提供错误的信息你的问题很详细但答案很差:
答案很简单:
subview.frame.size.height = rootView.frame.size.height
subview.frame.size.width = rootView.frame.size.width
我遇到了同样的问题。我在 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()
我在 Xcode 中创建了一个 XIB,并添加了一个简单的视图作为子视图:
我想实现的是子视图有一个固定的大小,根视图自动调整到该子视图的大小,并在其周围留出 20.0 的边距:
所以我给子视图添加了固定宽度和固定高度的约束。然后我为 20.0 边距添加四个约束:
由于 superview 没有任何约束,因此不应存在歧义或冲突约束:我希望 superview 缩小以匹配约束。但是,Xcode 抱怨:
这些约束只有在根视图具有固定大小并且看起来就是这种情况时才会发生冲突。所以我的问题是:如何使 XIB 的根视图灵活,以便它动态调整其大小以匹配其内容?
(使用 Interface Builder 甚至可能吗?)
How can I make the rootview of a XIB flexible so that it dynamically adjusts its size to match its contents?
不可能的界面生成器。
As the superview does not have any constraints there should be neither ambiguity nor conflicting constraints
它不仅仅是一个超级视图。它也是笔尖中的一个对象。我们为此类视图定义模拟大小。这可以用来消除错误。但同样,这些只是模拟的。
这个 rootView 是视图控制器视图吗?如果是,我不明白你为什么要将它的宽度固定为 280,将高度固定为 168。
如果此视图是您要添加到另一个 'parent' 视图的自定义视图。然后您应该将模拟大小更改为 280 和高度 168,并且在将其添加为子视图时您需要添加两个约束以将此根视图定位在 'parent' 视图中。
您可以通过手动编辑 xib 来完成此操作,例如设置高度限制(在我的例子中,设置最小高度是不等式):
- 为高度的子视图添加约束
- 将 xib 作为文本文件打开
- 找到您添加的约束(例如通过 Cmd-F'ing 到高度值)
- 将其剪切并粘贴到根视图的约束部分
- 再次在界面生成器中打开 xib
- 约束出现,您可以正常编辑它。
天哪,我不敢相信你接受了这是不可能的并改变了你的方式,如果这是不可能的那么 Xib 将毫无用处。请不要向其他人提供错误的信息你的问题很详细但答案很差:
答案很简单:
subview.frame.size.height = rootView.frame.size.height
subview.frame.size.width = rootView.frame.size.width
我遇到了同样的问题。我在 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()