在 Swift 中以编程方式将视图添加到 stackview
Posted
技术标签:
【中文标题】在 Swift 中以编程方式将视图添加到 stackview【英文标题】:Add views to stackview programmatically in Swift 【发布时间】:2018-08-20 08:34:59 【问题描述】:我有一个水平堆栈视图,它填充了屏幕的整个宽度并包含 3 个垂直堆栈视图,当控制器加载时它们是空的。
水平的对齐设置为填充和分布到相等的间距,垂直的对齐左,中,右和分布填充相等。
当用户稍后导航回这个场景时,我可能想要填充这些 StackViews。因此我覆盖了viewWillAppear
并在里面做了这样的事情:
DispatchQueue.global(qos: .userInitiated).async
// here i need to load the data for the labels
DispatchQueue.main.async
var label = UILabel()
label.text = //...
self.firstStackView.addArrangedSubview(label)
label = UILabel()
label.text = //...
self.secondStackView.addArrangedSubview(label)
var btn = UIButton()
btn.setTitle("X", for: .normal)
btn.addTarget(//...)
self.thirdStackView.addArrangedSubview(btn)
现在,我只看到第三个堆栈视图的按钮。即使我多次这样做,我也只会看到第一个按钮。我认为这是因为堆栈视图起初是空的,并且它们的大小没有更新。我是否必须调用任何函数才能重新创建所有视图? (但有新的子视图)
编辑: 我找到了一种解决方法:我为情节提要中的 3 个堆栈视图中的每一个添加了一些标签,然后在代码中再次删除它们。它有效,但我认为这不是一个很好的解决方案,如果我需要再次删除标签,stackviews 不会变小。一定有更好的办法。
【问题讨论】:
你做错了。 StackViews 本质上是可视数组,可以填充任何你想要的东西。您必须创建一个项目数组并将这些项目加载到 StackView 中。我正在写一个答案,所以我需要一些时间来完成它。 【参考方案1】:private var lbl1: UILabel!
private var lbl2: UILabel!
private var horizontalStackView: UIStackView!
private let setupLabelBlock = () -> UILabel in
let label = UILabel()
label.textColor = .white
label.setFontSize(16)
label.textAlignment = .center
return label
private func setupSubviews()
setupLabels()
setupHorizontalStackView()
private func setupLabels()
lbl1 = setupLabelBlock()
lbl2 = setupLabelBlock()
private func setupHorizontalStackView()
horizontalStackView = UIStackView(arrangedSubviews: [lbl1, lbl2])
horizontalStackView.axis = .horizontal
horizontalStackView.alignment = .fill
horizontalStackView.distribution = .fill
horizontalStackView.spacing = 2
根据需求调用setupSubviews
方法。
我希望,解决方案对您有所帮助。
【讨论】:
以上是关于在 Swift 中以编程方式将视图添加到 stackview的主要内容,如果未能解决你的问题,请参考以下文章
当 iAd 横幅出现时,如何将视图的内容上移? (在 Swift 中以编程方式)
如何在 Swift 4 中以编程方式将 IBAction 添加到按钮?
如何在 ios swift 中以编程方式将情节提要视图控制器加载到标签栏控制器中?