在代码

时间:2015-06-04 11:33:26

标签: ios iphone swift cocoa-touch autolayout

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

enter image description here

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

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

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方法中工作,但这意味着只有在过渡动画完成后才会出现所有黄色视图。

如果不在故事板中或在代码中完成任何操作,您是否知道如何实现它? UILabel,图片上的UIButton已删除为绿色centerView - 如果我在代码中添加centerView,我需要在代码中为此屏幕设置所有约束。

更新 @pteofil提供的解决方案为我工作 所以我在viewWillAppear中调用上面的代码:

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

2 个答案:

答案 0 :(得分:2)

您可以使用layoutIfNeeded触发自动布局,并让您的观看次数正确。

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

答案 1 :(得分:1)

您可以将所有黄色视图嵌入到您在界面构建器中定位的容器视图中。现在,您可以在代码中完成此视图中的所有内容。