swift - UIStackView setCustomSpacing 在运行时

标签 swift uistackview

我有一个水平的 UIStackView,默认情况下,它看起来如下:

default stack view

带有心脏的 View 最初是隐藏的,然后在运行时显示。我想减少心脏 View 和帐户名 View 之间的间距。
当在 viewDidLoad 中执行时,以下代码可以完成工作,但:

stackView.setCustomSpacing(8, after: heartView)

稍后更改自定义间距时,比如按下按钮时,它没有任何效果。现在,这里的问题是,一旦堆栈 View 中的 subview 发生变化,自定义间距就会丢失:当从堆栈 View 中取消/隐藏 View 时,自定义间距将被重置并且无法修改。

我试过的东西:

  • 通过打印 stackView.customSpacing(after: heartView) 验证间距设置(正确返回 8)
  • 未能成功运行多个重新加载函数:
    • stackView.layoutIfNeeded()
    • stackView.layoutSubviews()
    • view.layoutIfNeeded()
    • view.layoutSubviews()
    • viewDidLayoutSubviews()

如何在运行时更新堆栈 View 的自定义间距?

最佳答案

您需要确保 UIStackViewdistribution 属性设置为 .fill.fillProportionally .


我创建了以下 swift Playground ,看起来我可以在运行时使用随机值使用 setCustomSpacing 并查看其效果。

import UIKit
import PlaygroundSupport

public class VC: UIViewController {

    let view1 = UIView()
    let view2 = UIView()
    let view3 = UIView()
    var stackView: UIStackView!

    public init() {
        super.init(nibName: nil, bundle: nil)
    }

    public required init?(coder aDecoder: NSCoder) {
        fatalError()
    }

    public override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        view1.backgroundColor = .red
        view2.backgroundColor = .green
        view3.backgroundColor = .blue

        view2.isHidden = true

        stackView = UIStackView(arrangedSubviews: [view1, view2, view3])
        stackView.spacing = 10
        stackView.axis = .horizontal
        stackView.distribution = .fillProportionally

        let uiSwitch = UISwitch()
        uiSwitch.addTarget(self, action: #selector(onSwitch), for: .valueChanged)

        view1.addSubview(uiSwitch)
        uiSwitch.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            uiSwitch.centerXAnchor.constraint(equalTo: view1.centerXAnchor),
            uiSwitch.centerYAnchor.constraint(equalTo: view1.centerYAnchor)
        ])

        view.addSubview(stackView)
        stackView.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            stackView.heightAnchor.constraint(equalToConstant: 50),
            stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 50),
            stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -50)
        ])
    }

    @objc public func onSwitch(sender: Any) {
        view2.isHidden = !view2.isHidden
        if !view2.isHidden {
            stackView.setCustomSpacing(CGFloat(arc4random_uniform(40)), after: view2)
        }
    }
}

PlaygroundPage.current.liveView = VC()
PlaygroundPage.current.needsIndefiniteExecution = true

关于swift - UIStackView setCustomSpacing 在运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49306236/

相关文章:

ios - 从后台线程添加到 UITableView 中的 UIStackView

swift - UIImageView 在 StackView 和 TableViewCell 中不是自动高度

带有约束的 ScrollView 内的 iOS Swift stackview

arrays - 从 Swift 数组中获取随机元素出现

ios - NSFetchedResultsController 在向第二部分插入行时在第一部分返回错误的行数

ios - 图像缩放,质量不松动

ios - 如何在 swift 3 的前台和后台模式下刷新后台线程中的访问 token

ios11游戏中心查找玩家失败

ios - UIStackView:将 subview 推到边缘 ("Unlimited"间距)

ios - 在 UIScrollView 中嵌入 UIStackView 时出现问题