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

Posted

技术标签:

【中文标题】在代码中混合故事板和约束【英文标题】:Mixing storyboard and constraints in code 【发布时间】:2015-06-04 11:33:25 【问题描述】:

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

由于我们有不同的屏幕分辨率 - 屏幕上可以容纳不同数量的黄色视图。所有黄色视图的大小相同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。所以我基本上不能在没有父母的情况下向视图添加约束。 我的代码在viewDidAppear 方法中工作,但这意味着只有在过渡动画完成后才会出现所有黄色视图。

您是否知道如何在不使用情节提要或纯代码的情况下实现该功能。 UILabelUIButton 在图片上定位删除到绿色 centerView - 如果我在代码中添加 centerView,我需要在代码中设置此屏幕的所有约束。

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

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

【问题讨论】:

你在viewWillLayoutSubviews()viewDidLayoutSubviews()试过了吗? 您需要在 self.view 上致电layoutIfNeeded 【参考方案1】:

您可以使用layoutIfNeeded 触发自动布局并使您的视图具有正确的大小。

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

【讨论】:

UICollectionView 在这里将是一个矫枉过正。我不需要滚动它。那是一行静态图像。【参考方案2】:

您可以将所有黄色视图嵌入到您在界面构建器中放置的容器视图中。现在您可以在代码中执行此视图中的所有内容了。

【讨论】:

以上是关于在代码中混合故事板和约束的主要内容,如果未能解决你的问题,请参考以下文章

在 appDelegate 中访问故事板和嵌套的 UIViewController

故事板和故事板包之间的区别?

ios swift故事板和xibs

故事板和苹果推荐

故事板和程序化视图

适用于 iPhone 和 iPad 的 Xcode 故事板和 xib