带有 UISegmentedControl 的 UIStackView

Posted

技术标签:

【中文标题】带有 UISegmentedControl 的 UIStackView【英文标题】:UIStackView with UISegmentedControl 【发布时间】:2021-01-12 12:12:59 【问题描述】:

我正在尝试使用此代码创建带有 3 个 UISegmentedControlUIStackView,并且我希望它们在垂直和水平方向上都居中:

let segmented = UISegmentedControl(items: ["SOLID","GRADIENT"])
let segmented2 = UISegmentedControl(items: ["SOLID","GRADIENT"])
let segmented3 = UISegmentedControl(items: ["SOLID","GRADIENT"])

segmented.selectedSegmentIndex = 0
segmented2.selectedSegmentIndex = 0
segmented3.selectedSegmentIndex = 0

let st = UIStackView(arrangedSubviews: [segmented, segmented2, segmented3])
st.axis = .vertical
st.spacing = 5;
st.alignment = .center

self.addSubview(st)

st.translatesAutoresizingMaskIntoConstraints = false
st.topAnchor.constraint(greaterThanOrEqualTo: self.topAnchor, constant: 0.0).isActive = true
st.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0.0).isActive = true
st.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 0.0).isActive = true
st.bottomAnchor.constraint(greaterThanOrEqualTo: self.bottomAnchor, constant: 0.0).isActive = true
st.centerXAnchor.constraint(equalTo: self.centerXAnchor, constant: 0.0).isActive = true
st.centerYAnchor.constraint(equalTo: self.centerYAnchor, constant: 0.0).isActive = true

问题是我得到了这个观点:

知道如何解决这个问题吗?我希望它们都处于相同的高度。

【问题讨论】:

【参考方案1】:

首先,由于您的约束使用self(如self.topAnchor),此代码必须属于UIView 子类。

不清楚您的最终目标是什么...您希望分段控件堆栈来确定视图的高度吗?或者您是否希望控件高度由视图的高度确定?您如何设置包含此控件堆栈的自定义视图的约束?

在任何情况下,您都可以通过添加以下行来使分段控件的高度相等:

st.distribution = .fillEqually

但是,无论您在做什么,您当前对堆栈视图的约束都可能不正确。

试试这样:

    st.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
    st.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
    st.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
    st.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true

不需要centerXcenterY 约束。

另一种设置这些约束的方法更简洁易读,如下所示:

    NSLayoutConstraint.activate([
        st.topAnchor.constraint(equalTo: self.topAnchor),
        st.leadingAnchor.constraint(equalTo: self.leadingAnchor),
        st.trailingAnchor.constraint(equalTo: self.trailingAnchor),
        st.bottomAnchor.constraint(equalTo: self.bottomAnchor),
    ])

【讨论】:

【参考方案2】:

我相信这一点:

st.bottomAnchor.constraint(greaterThanOrEqualTo: self.bottomAnchor, constant: 0.0).isActive = true

应该倒置为:

st.bottomAnchor.constraint(lessThanOrEqualTo: self.bottomAnchor, constant: 0.0).isActive = true

因为您希望堆栈视图底部锚点的 y 位置小于视图自身底部锚点的 y 位置值。

一般来说,尾锚和底部锚的约束常数必须反转。

【讨论】:

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

带有 Bezeled 样式的 UISegmentedControl 使设备上的标题不居中

在带有 XIB 的视图控制器上以编程方式初始化 UISegmentedControl

UISegmentedControl和View切换问题

UISegmentedControl去掉背景色与UIScrollView联动

UITableView 和 UISegmentedControl

配置 UISegmentedControl 动画