Saya mencoba menambahkan tampilan di UIStackView secara terprogram. Untuk saat ini kode saya adalah:
UIView *view1 = [[UIView alloc]init];
view1.backgroundColor = [UIColor blackColor];
[view1 setFrame:CGRectMake(0, 0, 100, 100)];
UIView *view2 = [[UIView alloc]init];
view2.backgroundColor = [UIColor greenColor];
[view2 setFrame:CGRectMake(0, 100, 100, 100)];
[self.stack1 addArrangedSubview:view1];
[self.stack1 addArrangedSubview:view2];
Ketika saya menggunakan aplikasi, hanya ada 1 tampilan dan itu adalah dengan warna hitam. (View1 mendapatkan parameter untuk view2 juga)
ios
objective-c
ios9
uistackview
Altimir Antonov
sumber
sumber
addArrangedSubview:
, bukanaddSubview:
Jawaban:
Tampilan tumpukan menggunakan ukuran konten intrinsik, jadi gunakan batasan tata letak untuk menentukan dimensi tampilan.
Ada cara mudah untuk menambahkan kendala dengan cepat (contoh):
Kode Lengkap:
Catatan: Ini diuji pada iOS 9
sumber
UIViews
tidak. Jika poster asli menggunakanUILabel
instanceUIView
, kode-nya tidak akan berfungsi seperti yang diharapkan. Saya menambahkan contoh yang menunjukkan ini di bawah.Swift 5.0
Berdasarkan jawaban @ user1046037.
sumber
activate(_:)
, dan biasanya lebih efisien untuk melakukannya dengan cara ini developer.apple.com/documentation/uikit/nslayoutconstraint/…UIStackView
menggunakan kendala secara internal untuk mengatur subview yang diatur. Kendala apa yang dibuat tergantung pada bagaimana tampilan tumpukan itu sendiri dikonfigurasi. Secara default, tampilan tumpukan akan menciptakan kendala yang mengatur tampilan subviews dalam garis horizontal, menyematkan tampilan depan dan belakang ke tepi depan dan belakangnya sendiri. Jadi kode Anda akan menghasilkan tata letak yang terlihat seperti ini:Ruang yang dialokasikan untuk masing-masing subview ditentukan oleh sejumlah faktor termasuk ukuran konten intrinsik subview dan resistensi kompresi serta prioritas pelukan konten. Secara default,
UIView
instance tidak menentukan ukuran konten intrinsik. Ini adalah sesuatu yang umumnya disediakan oleh subkelas, sepertiUILabel
atauUIButton
.Karena resistensi kompresi konten dan prioritas pelukan konten dari dua
UIView
instance baru akan sama, dan tidak ada tampilan yang menyediakan ukuran konten intrinsik, mesin tata letak harus membuat tebakan terbaik untuk ukuran apa yang harus dialokasikan untuk setiap tampilan. Dalam kasus Anda, ini menetapkan tampilan pertama 100% dari ruang yang tersedia, dan tidak ada pada tampilan kedua.Jika Anda mengubah kode Anda untuk menggunakan
UILabel
instance, Anda akan mendapatkan hasil yang lebih baik:Perhatikan bahwa Anda tidak perlu membuat kendala sendiri secara eksplisit. Ini adalah manfaat utama penggunaan
UIStackView
- menyembunyikan detail (seringkali jelek) dari manajemen kendala dari pengembang.sumber
UIView
itu sendiri tidak memiliki ukuran intrinsik. Anda mungkin perlu menerapkan batasan tambahan untuk tampilan ini sehingga tampilan tumpukan tahu seberapa besar membuatnya.MyTextField.top = top+20
danbottom = MyTextField.bottom+20
. Saya berharap ini akan memberikan pandangan saya ketinggian intrinsik 70, tetapi malah mengeluh tentang kendala yang saling bertentangan. Apakah Anda tahu apa yang sedang terjadi di sini? Pandangan inilah yang ingin saya tempatkan di dalam UIStackView saya.Dalam Swift 4.2
sumber
Anda harus mengatur jenis distribusi Anda. Dalam kode Anda, tambahkan saja:
Atau Anda dapat mengatur distribusi langsung di pembangun antarmuka Anda. Sebagai contoh:
Semoga itu bisa membantu;) Lapinou.
sumber
Mengikuti dua baris memperbaiki masalah saya
Versi cepat -
sumber
Untuk jawaban yang diterima ketika Anda mencoba untuk menyembunyikan tampilan apa pun di dalam tampilan tumpukan, kendala berfungsi tidak benar.
Alasannya adalah ketika menyembunyikan
view
distackView
dalamnya akan mengatur ketinggian ke 0 untuk menghidupkannya.Solusi mengubah kendala
priority
seperti di bawah ini.sumber
Ditingkatkan pada jawaban oleh @Oleg Popov
sumber
Dalam kasus saya, hal yang mengacaukan yang saya harapkan adalah bahwa saya melewatkan baris ini:
Setelah itu tidak perlu mengatur batasan untuk subview saya yang diatur apa pun, stackview yang mengurusnya.
sumber
Swift 5 versi jawaban Oleg Popov , yang didasarkan pada jawaban user1046037 ini
sumber
Saya baru saja menemukan masalah yang sangat mirip. Sama seperti yang disebutkan sebelumnya dimensi tampilan tumpukan bergantung pada satu ukuran konten intrinsik dari subview yang diatur. Ini solusi saya di Swift 2.x dan struktur tampilan berikut:
lihat - UIView
customView - CustomView: UIView
stackView - UISTackView
subview yang diatur - subkelas UIView khusus
sumber
Coba kode di bawah ini,
Semoga berhasil. Harap beri tahu saya jika Anda membutuhkan klarifikasi lagi
sumber