You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Scroll View内Stack View中的元素水平居中?

问题描述

我写了一段代码,将包含大量按钮的Stack View嵌入Scroll View中,代码如下:

import UIKit
import SnapKit

class ViewController: UIViewController {
    var scrollView: UIScrollView!
    var stackView: UIStackView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let scrollView = UIScrollView()
        scrollView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(scrollView)
        
        scrollView.snp.makeConstraints { (make) in
            make.edges.equalToSuperview()
        }
        
        let stackView = UIStackView()
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.axis = .vertical
        scrollView.addSubview(stackView)
        
        stackView.snp.makeConstraints { (make) in
            make.edges.equalToSuperview()
        }
        
        for _ in 1 ..< 100 {
            let vw = UIButton(type: UIButtonType.system)
            vw.setTitle("Button", for: [])
            stackView.addArrangedSubview(vw)
        }
    }
}

运行后按钮呈左对齐状态:
按钮左对齐显示效果

Stack View仅会包裹现有视图,我不确定该如何让这些按钮在屏幕居中——是需要给按钮本身添加布局约束,还是可以通过Stack View的alignment或distribution属性实现?

解决方案

不需要给每个按钮单独添加约束,直接通过Stack View的属性就能实现按钮居中,只需两步:

  • 设置Stack View的alignment属性为.center:因为你的Stack View是垂直方向(axis = .vertical),这个属性会让所有子视图在横向方向上居中对齐。
  • 给Stack View绑定宽度约束:原来的代码仅设置了edges.equalToSuperview(),但Scroll View的内容宽度需要明确,添加make.width.equalToSuperview()可以让Stack View宽度和屏幕一致,确保按钮的居中效果对应到屏幕中间。

修改后的核心代码片段:

let stackView = UIStackView()
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.axis = .vertical
// 添加横向居中对齐
stackView.alignment = .center
scrollView.addSubview(stackView)

stackView.snp.makeConstraints { (make) in
    make.edges.equalToSuperview()
    // 绑定宽度到ScrollView,确保和屏幕同宽
    make.width.equalToSuperview()
}

修改后所有按钮会在屏幕横向居中显示,同时保留Scroll View的垂直滚动功能。

内容的提问来源于stack exchange,提问作者BigBoy1337

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:24:20