Saya mencoba membuat UIStackView dengan 3 UISegmentedControl dengan kode ini, dan saya ingin mereka menjadi pusat baik secara vertikal maupun horizontal:

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

Masalahnya adalah saya mendapatkan tampilan ini:

enter image description here

Adakah yang tahu bagaimana saya bisa memperbaiki masalah ini? Saya ingin mereka semua akan berada di ketinggian yang sama.

0
YosiFZ 12 Januari 2021, 15:12

2 jawaban

Jawaban Terbaik

Pertama, karena batasan Anda menggunakan self (seperti dalam self.topAnchor), kode ini harus dimiliki oleh subkelas UIView.

Tidak jelas apa tujuan akhir Anda... Apakah Anda ingin tumpukan kontrol tersegmentasi menentukan ketinggian tampilan? Atau apakah Anda ingin ketinggian kontrol ditentukan oleh ketinggian tampilan? Bagaimana Anda mengatur batasan tampilan kustom yang menampung tumpukan kontrol ini?

Bagaimanapun, Anda bisa mendapatkan kontrol tersegmentasi menjadi sama Tinggi hanya dengan menambahkan baris ini:

st.distribution = .fillEqually

Namun, apa pun yang Anda lakukan, batasan Anda saat ini untuk tampilan tumpukan mungkin salah.

Cobalah seperti ini:

    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

Tidak perlu batasan centerX atau centerY.

Cara lain untuk mengatur batasan tersebut, yang sedikit lebih ringkas dan mudah dibaca, adalah seperti ini:

    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
DonMag 12 Januari 2021, 13:21

Saya percaya ini:

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

Harus dibalik menjadi:

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

Karena Anda ingin posisi y dari jangkar bawah tampilan tumpukan menjadi nilai yang lebih kecil daripada posisi y dari jangkar bawah tampilan itu sendiri.

Secara umum konstanta kendala harus dibalik untuk trailing dan jangkar bawah.

0
Estel 12 Januari 2021, 12:25