在代码中混合故事板和约束
Posted
技术标签:
【中文标题】在代码中混合故事板和约束【英文标题】:Mixing storyboard and constraints in code 【发布时间】:2015-06-04 11:33:25 【问题描述】:我正在尝试从这个线框实现视图控制器
由于我们有不同的屏幕分辨率 - 屏幕上可以容纳不同数量的黄色视图。所有黄色视图的大小相同UIImageView
s,包含相同的图像。
我要做的是在情节提要中布局视图控制器,但黄色视图除外。然后我计算可以容纳的黄色视图数量,并使用代码中的自动布局添加它们。像这样:
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
问题在于viewDidLoad
和viewWillAppear
方法中还没有触发自动布局。所以centerImageView
没有正确的大小和位置。此外,此时它的超级视图是nil
。所以我基本上不能在没有父母的情况下向视图添加约束。
我的代码在viewDidAppear
方法中工作,但这意味着只有在过渡动画完成后才会出现所有黄色视图。
您是否知道如何在不使用情节提要或纯代码的情况下实现该功能。 UILabel
,UIButton
在图片上定位删除到绿色 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】:
您可以将所有黄色视图嵌入到您在界面构建器中放置的容器视图中。现在您可以在代码中执行此视图中的所有内容了。
【讨论】:
以上是关于在代码中混合故事板和约束的主要内容,如果未能解决你的问题,请参考以下文章