看起来好像在你的时候
instantiateViewControllerWithIdentifier
它不会在故事板设计界面上对UIView实例应用任何约束,但对UILabel等其他对象也是如此。这真的是规则吗?
继续阅读完整示例。
我可以重新添加约束,一切都很棒。我也可以使用ContainerView并嵌入目标ViewController,它工作得很好。我只是想了解这些局限性。只有当我在代码中执行此操作时才能看到此行为。
这是我从故事板开始的设置:
所以我有一个空的初始视图控制器,我有一个" NextViewController"与1 UIView。仔细看看那里:
我将NextViewController的根视图上的背景颜色设置为浅绿色:
设计时间将UIView(插件到contentView)添加到浅蓝色。另外,我在较浅的blue / contentView视图上设置了约束:
填写您所查看的任何视图,因为我理解这些限制。
现在我的" View Controller"中的代码初始化"下一个视图控制器":
override func viewDidLoad() {
super.viewDidLoad()
var next = storyboard?.instantiateViewControllerWithIdentifier("NextViewController")! as NextViewController
println(next.view.constraintsAffectingLayoutForAxis(.Vertical))
println(next.view.constraintsAffectingLayoutForAxis(.Horizontal))
println(next.contentView.constraintsAffectingLayoutForAxis(.Vertical))
println(next.contentView.constraintsAffectingLayoutForAxis(.Horizontal))
view.addSubview(next.view)
}
该代码通过以下日志记录为我提供了此输出:
请注意,constraintsAffectingLayoutForAxis
视图和next.view
的{{1}}全部显示为空。另请注意,我们看到屏幕上充满了青柠色,但我们看不到浅蓝色。
此外,这些行的值有助于解释:
next.contentView
我可以解决这个问题,如果我应用以下约束条件,则会显示淡蓝色内容视图:
// true
println(next.view.translatesAutoresizingMaskIntoConstraints())
// false
println(next.contentView.translatesAutoresizingMaskIntoConstraints())
如果我在" View Controller"中执行以下操作,我可以实现相同的渲染输出。同样。我省略了上面的所有加载代码并使用了故事板容器视图:
以下约束适用于容器:
因此,似乎var names = ["contentView": next.contentView]
var h1 = NSLayoutConstraint.constraintsWithVisualFormat("H:|[contentView]|",
options: NSLayoutFormatOptions(0), metrics: nil, views: names)
var v1 = NSLayoutConstraint.constraintsWithVisualFormat("V:|[contentView]|",
options: NSLayoutFormatOptions(0), metrics: nil, views: names)
view.addConstraints(h1 + v1)
显然正在做某事或者没有做一些故事板中的容器视图正在做/不做的事情。
我跑的另一个测试是添加一个带有中心X / Y约束的标签作为淡蓝色容器的兄弟:
呈现如下:
UILabel的约束保持不变,但contentView的约束不存在!加载此示例的代码:
instantiateViewControllerWithIdentifier
只是为了看看UILabel上translatesAutoResizingMask的内容:
var next = storyboard?.instantiateViewControllerWithIdentifier("NextViewController")! as NextViewController
view.addSubview(next.view)
我还尝试将其他UIView添加到故事板中的设计图面,并设置其约束以占据整个视图。我的想法可能是它只会杀死它遇到的第一次UIView的限制。简短的回答是否定的,如果他们的约束被告知边缘到边缘,那么所有UIView都会受到影响。
我还添加了一个并不是边缘到边缘的UIView。它的约束被保留了下来。
这让我想问,这里发生了什么?我是否应该始终考虑ViewControllers中的UIViews,如果它们的约束是边缘到边缘的话我加载// true
println(next.view.translatesAutoresizingMaskIntoConstraints())
// false
println(next.contentView.translatesAutoresizingMaskIntoConstraints())
// false
println(next.myLabel.translatesAutoresizingMaskIntoConstraints())
?