UIStackView 对齐问题

Posted

技术标签:

【中文标题】UIStackView 对齐问题【英文标题】:UIStackView alignment issue 【发布时间】:2019-12-18 09:25:24 【问题描述】:

我想达到这个要求

如果垂直堆栈有两个标签而不是文本应该与图像居中对齐

如果不是顶部对齐到图像

如何在不编写任何代码的情况下实现这一目标

【问题讨论】:

【参考方案1】:

您需要控制外部(即包含图像和标签的堆栈视图的最终堆栈视图)堆栈视图的alignment

由于您需要控制哪些标签需要添加到标签的堆栈视图中,因此我假设您将以编程方式执行此操作。所以基本上你需要:

finalStackView.alignment = labelsStackView.arrangedSubviews.count > 2 ? .top : .center

这是一个产生以下输出的完整示例:

class ViewController: UIViewController 

    let finalStackView = UIStackView()

    override func viewDidLoad() 
        super.viewDidLoad()
        let imageView = UIImageView()
        imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.heightAnchor.constraint(equalToConstant: 200).isActive = true
        imageView.widthAnchor.constraint(equalToConstant: 200).isActive = true
        imageView.image = #imageLiteral(resourceName: "taylor-swift")

        let label1 = UILabel()
        let label2 = UILabel()
        let label3 = UILabel()
        let label4 = UILabel()

        label1.translatesAutoresizingMaskIntoConstraints = false
        label2.translatesAutoresizingMaskIntoConstraints = false
        label3.translatesAutoresizingMaskIntoConstraints = false
        label4.translatesAutoresizingMaskIntoConstraints = false

        label1.text = "Hello"
        label2.text = "72 mins"
        label3.text = "Hello 3"
        label4.text = "Hello 4"

        let labelsStackView = UIStackView(arrangedSubviews: [label1, label2, label3, label4])
        labelsStackView.translatesAutoresizingMaskIntoConstraints = false
        labelsStackView.axis = .vertical
        labelsStackView.distribution = .fill
        labelsStackView.alignment = .leading

        finalStackView.addArrangedSubview(imageView)
        finalStackView.addArrangedSubview(labelsStackView)
        finalStackView.axis = .horizontal
        finalStackView.distribution = .fill
        finalStackView.alignment = labelsStackView.arrangedSubviews.count > 2 ? .top : .center

        view.addSubview(finalStackView)
        finalStackView.translatesAutoresizingMaskIntoConstraints = false
        finalStackView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        finalStackView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        finalStackView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    


    

使用上面的确切代码,输出为:

将 2 个标签添加到 labelsStackView,输出为:

【讨论】:

【参考方案2】:

labels vertical stackview 保存在Horizontal stackView 中。

如果您有超过 2 个标签,请将 Horizontal stackView 对齐更改为 top 否则保留为 center

你的布局结构应该是这样的


> main stack view (Horizontal)
 > Image
 > stack view (Horizontal)
   >labels stack view (Vertical)
    > Labels

【讨论】:

以上是关于UIStackView 对齐问题的主要内容,如果未能解决你的问题,请参考以下文章

UIStackView 会工作吗?

使用 UINavigationController 时 UIStackView 无法设置底部约束

使用 UIStackView 时,UIImageView 在 UITableViewCell 内被挤压

Swift:扩展 UIStackView 以创建居中的标签列表

UIStackView 对齐问题

如何在水平 UIStackView 中对齐两个标签的底部?