如何让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
相关产品推荐
相关产品推荐

