故事板中的约束ViewController的根视图不适用于instantiateViewControllerWithIdentifier

时间:2015-03-23 20:26:50

标签: ios xcode autolayout uistoryboard

看起来好像在你的时候 instantiateViewControllerWithIdentifier它不会在故事板设计界面上对UIView实例应用任何约束,但对UILabel等其他对象也是如此。这真的是规则吗?

继续阅读完整示例。

我可以重新添加约束,一切都很棒。我也可以使用ContainerView并嵌入目标ViewController,它工作得很好。我只是想了解这些局限性。只有当我在代码中执行此操作时才能看到此行为。

这是我从故事板开始的设置:

Storyboard Setup

所以我有一个空的初始视图控制器,我有一个" NextViewController"与1 UIView。仔细看看那里:

我将NextViewController的根视图上的背景颜色设置为浅绿色:

Lime Green Background

设计时间将UIView(插件到contentView)添加到浅蓝色。另外,我在较浅的blue / contentView视图上设置了约束:

Consatraints

填写您所查看的任何视图,因为我理解这些限制。

现在我的" 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)
}

该代码通过以下日志记录为我提供了此输出:

Output 1

请注意,constraintsAffectingLayoutForAxis视图和next.view的{​​{1}}全部显示为空。另请注意,我们看到屏幕上充满了青柠色,但我们看不到浅蓝色。

此外,这些行的值有助于解释:

next.contentView

我可以解决这个问题,如果我应用以下约束条件,则会显示淡蓝色内容视图:

// true
println(next.view.translatesAutoresizingMaskIntoConstraints())

// false
println(next.contentView.translatesAutoresizingMaskIntoConstraints())

Output 2

如果我在" View Controller"中执行以下操作,我可以实现相同的渲染输出。同样。我省略了上面的所有加载代码并使用了故事板容器视图:

View Controller With Container

以下约束适用于容器:

Consatraints

因此,似乎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约束的标签作为淡蓝色容器的兄弟:

Sibling Label

呈现如下:

Centered Label Output

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

0 个答案:

没有答案