gpt4 book ai didi

swift - UIStackView setCustomSpacing 在运行时

转载 作者:可可西里 更新时间:2023-11-01 00:20:33 25 4
gpt4 key购买 nike

我有一个水平的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com