在代码中混合故事板和约束

Mixing storyboard and constraints in code

我正在尝试从此线框实现视图控制器

由于我们有不同的屏幕分辨率 - 不同数量的黄色视图可以显示在屏幕上。所有黄色视图大小相同 UIImageViews,包含相同的图像。

我想做的是在故事板中布局视图控制器,黄色视图除外。然后我计算屏幕可以容纳的黄色视图数量,并使用代码中的自动布局添加它们。像这样:

let numberOfViewsPerSide = numberOfViewsOnEachSide()
let viewImage = UIImage (named: "repeat_image")
var prevView = centerImageView
if let viewImage = viewImage {
    for index in 0...(numberOfViewsPerSide - 1) {
        var newView = UIImageView(image: viewImage)
        newView.setTranslatesAutoresizingMaskIntoConstraints(false)
        let views = ["prevView" : prevView, "newView" : newView]

        self.view.addSubview(newView)
        let constraint_H = NSLayoutConstraint.constraintsWithVisualFormat("H:[newView]-15-[prevView]", options: NSLayoutFormatOptions.AlignAllCenterY, metrics: nil, views: views)
        self.view.addConstraints(constraint_H)
        prevView = newView
    }
}

问题是 viewDidLoadviewWillAppear 方法中的自动布局尚未触发。所以 centerImageView 没有正确的大小和位置。此外,此时它的超级视图是 nil 。所以我基本上不能在没有 parent 的情况下添加约束来查看。 我的代码在 viewDidAppear 方法中工作,但这意味着所有黄色视图只会在过渡动画完成后出现。

您是否知道如何在不在故事板或纯代码中完成所有操作的情况下实现它。 UILabelUIButton 位于删除到绿色的图片上 centerView - 如果我在代码中添加 centerView 我需要在代码中设置此屏幕的所有约束。

更新: @pteofil 提供的解决方案对我有用 所以我在 viewWillAppear 中这样调用上面的代码:

override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.view.layoutIfNeeded()
        addRepeatedImages()
    }

您可以使用 layoutIfNeeded 触发自动版式并使您的视图大小正确。

但是您的黄色视图看起来几乎可以使用 UICollectionView 来管理它们...

您可以将所有黄色视图嵌入到您在界面生成器中定位的容器视图中。现在您可以在代码中执行此视图中的所有操作。