Swift - UIScrollview 中的子 UIView 直到旋转后才显示

Swift - Child UIView in UIScrollview not showing until after rotation

我在使用自动布局构建基本 UIScrollView 示例时遇到了一些奇怪的行为。

在情节提要编辑器中,我添加了一个 UIScrollView 作为默认 UIView 的子视图,并在其中添加了一个新的 UIView 并将其命名为 contentView:

View

--scrollView

----contentView

我向 contentView 添加了一些标签和文本框,并将它们的约束设置到父容器 (contentView)。

我还将 contentView 的约束设置到 UIScrollView,将 UIScrollView 设置到它的父级,最后将 contentView 设置为使用与顶级 UIView 相同的高度和宽度。添加约束后,所有关于缺少约束的错误或警告都消失了,屏幕看起来完全符合我在 Storyboard 编辑器中的要求。

为了便于故障排除,我将主视图着色为蓝色,将 UIScrollView 着色为黄色,将 contentView 着色为绿色。

当我 运行 模拟器或真实 phone 上的应用程序时,文本字段是 sh运行k 而不是 200 宽,标签 3 及其文本框是丢失(最有可能在屏幕外)并且屏幕为黄色,表示正在显示 UIScrollView。一旦我旋转屏幕,一切看起来都和它应该的一样:

Gifycat image link as I can't post images yet

打印出框架的宽度:

我使用 Xcode 6.4 和 7.0 beta 4 在 Swift 1 和 2 中复制了此行为。

所以我通过重写 viewController.swift

中的 viewDidLayoutSubviews() 函数设法修复了子 UIView
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        let widthConstraint = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: parentView.frame.width)

        contentView.addConstraint(widthConstraint)

        let heightConstraint = NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: parentView.frame.height)
        contentView.addConstraint(heightConstraint)
    }

parentView 是顶级 UIView 的出口,而 contentView 是 UIScrollView 中子 UIView 的出口。