Bir UIStackView içine eklenen görüntülemek için önde gelen dolgu ekleme


128

Bu benim kurulumum: UIScrollViewÖnde gelen, üst, deneme kenarı 0'a ayarlanmış bir UIStackViewvar. Bunun içine şu kısıtlamalarla bir ekliyorum :

stackView.centerYAnchor.constraintEqualToAnchor(selectedContactsScrollView.centerYAnchor).active = true  
stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

Yığın görünümünün içine bazı görünümler ekliyorum.
Benim sorunum, kısıtlamalar nedeniyle yığın görünümüne eklenen ilk görünümün de ön kenar = 0 olacak olmasıdır.

İlk görünüme bazı dolgu ekleyebilmemin yolları nelerdir? Kaydırma görünümü kısıtlamalarını ayarlamadan.


2
kabul edilen cevabı değiştirir misin? Tolga'nın cevabı çok daha iyi görünüyor.
Honey

Yanıtlar:


27

Sağladığınız çözüm, UIStackView'unuzun içindeki görünümleriniz için bir dolgu eklemiyor (soruda istediğiniz gibi), ancak UIStackView için bir lider ekler.

Bir çözüm, orijinal UIStackView'unuza başka bir UIStackView eklemek ve bu yeni UIStackVIew'e liderlik vermek olabilir. Ardından, görünümlerinizi bu yeni UIStackView'a ekleyin.

İpucu, bunu tamamen Interface Builder kullanarak yapabilirsiniz. Başka bir deyişle, bunun için kod yazmaya gerek yok.


376

Tüm isLayoutMarginsRelativeArrangementözelliği doğruysa, yığın görünümü olan düzen kenar göre belirlenen düzenlenmiş görünümleri düzeni olacaktır.

stackView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
stackView.isLayoutMarginsRelativeArrangement = true

Ancak yığın görünümünün içindeki tüm düzenlenmiş görünümleri etkiler. Bu dolguyu yalnızca bir düzenlenmiş görünüm için istiyorsanız, iç içe yerleştirilmişUIStackView


2
isLayoutMarginsRelativeArrangementalıcıdır, ayarlayıcıdır layoutMarginsRelativeArrangement. Cevabı düzenleyemiyorum
maross

5
@maross Swift'de alıcı ve ayarlayıcı işlevi arasında bir fark yoktur. Ama haklısın, layoutMarginsRelativeArrangementbunun yerine Objective-C ile gelişen insanlar kullanmalı . Resmi belgeler: developer.apple.com/reference/uikit/uistackview/…
Tolga Okur

3
Objective-C için:stackView.layoutMargins = UIEdgeInsetsMake(0, 20, 0, 20); [stackView setLayoutMarginsRelativeArrangement:YES];
Snouto

4
Şubat 2019, gece yarısı ofiste otururken - Bunun gibi cevaplar bana ilerlemem için güç veriyor. Teşekkürler @tolpp
nefarianblack

157

Kısıtlamaların bir Yığın Görünümü içinde çalışmadığını veya biraz garip göründüklerini buldum.

(Örneğin, görüntü yığını görünümünde seçilene baştaki / sondaki kısıtlamayı eklersem, bu, koleksiyon görünümüne de yol açar, ancak sonda eklemez; ve kesinlikle çelişki yaratır).

stackview içinde stackview

Yığın görünümü içindeki tüm görünümler için mizanpaj marjlarını ayarlamak için şunu seçin:

Stack View > Size Inspector > Layout Margins > Fixed

Not: Bu "Fixed"seçenek, "Explicit"ekran görüntülerinde görüldüğü gibi önceden çağrılmıştı .

Ardından dolgunuzu ekleyin:

film şeridi


23
Apple'ın sakladığı şeylerden biri. Xcode'un iyi, arkadaş canlısı ve kolay olmanın tam tersi olmasından nefret ediyorum. Teşekkürler
Duck

Bu açık düzen marjlarını değiştirdiğimde Xcode çökmeye devam ediyor. Bir hatayı dosyaladılar ancak yineleme olduğunu söylediler.
mvandillen

Kullanıcı arayüzünde bulamadığım şey bu. Yığın Görünümü kenar boşlukları alanlarını görmek için Düzen Kenar Boşluklarını Açık olarak değiştirin.
pkamb

13
FYI XCode 9 artık bunu "Açık" yerine "Sabit" olarak adlandırıyor.
Mel

Ayrıca Xcode 9'da, Dosya denetçisindeki "Güvenli Alan Yerleşimi Kılavuzlarını Kullan" seçeneğinin işaretini kaldırın; bu, yazarken IB'de hala birçok soruna neden olur ve kısıtlamalarınız için normal Yerleşim kılavuzlarına bağlı kalın.
PJ_Finnegan

16

Benim için işe yarayan şey, yalnızca bir boşluk bırakıcı olan başka bir UIView görünümüne yığın eklemek (en azından stackView.distribution = .Fill ile çalışır):

let spacerView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 10))
stackView.addArrangedSubview(spacerView)
stackView.addArrangedSubview(viewThatNeedsSpaceBeforeIt)
stackView.addArrangedSubview(NextView)...

6

swift 3: Sadece şunlara göre dengelemeye ihtiyacınız var:

firstView.leadingAnchor.constraint(equalTo: parentView.leadingAnchor, constant: 200).isActive = true

Bu kısıtlamanın sizden sonra ayarlandığından emin olun. parentView.addArrangdSubView(firstView)


4

Yalnızca satır aralığı dolgusuna ihtiyacınız varsa, yığın görünümünün Hizalamasını "İzleyen" olarak ayarlayabilir ve ardından, içerdiği alt görünümlerin her biri için benzersiz Satır Aralığı kısıtlamaları belirlemekte özgür olacaksınız.

Bonus olarak, yığın görünümünün hizalamasını "Merkez" olarak ayarlayabilir ve ardından her öğeye her iki tarafta da kendi dolgusunu vermek için Önde Gelen ve / veya İzleyen kısıtlamaları kullanabilirsiniz.


1

Bu sorunun zaten iyi yanıtları var, Bir öneri spacing, görünümler arasındaki aralığı ayarlamak için özelliği kullanın. İlk ve son görünümler için iki seçenek olabilir, ya ekleri @tolpp önerdiği gibi ayarlayın ya da dolgu eklemek için sabit ile üst öğeye (yığın görünümü) kısıtlama ekleme ekleyin.


1

Çözüm, kısıtlama eklemek istediğiniz görünümleri tutmak için yığın görünümünde normal bir görünüme sahip olmaktır ve ardından öğeleriniz için yığın görünümündeki görünümlere göre kısıtlamalar ekleyebilirsiniz. Bu şekilde, orijinal görünümlerinizin yığın görünümü içinde ön ve arka kısıtlamaları olabilir.

Bu, arayüz oluşturucuda ve programlı olarak yapılabilir.


0

Yaptığımız şey, UIStackView'in ilk ve son çocukları olarak şeffaf bileşenler (örneğin, UIButton / UIView) eklemekti. Ardından, dolguyu ayarlamak için bu görünmez çocukların genişliğini sınırlayın.


-3

Görünüşe göre çözüm oldukça basitti. Onun yerine:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

Ben sadece yazdım:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor, constant: 15).active = true

1
aslında kodunuz urscrollview içinde uistackview için bir satır aralığı ekler, uistackview'inizdeki görünümleriniz için bir dolgu eklemiyor (soruda belirtildiği gibi)
William Kinaan

evet, ama dolgu ekleyip ekleyemeyeceğinizi bilmiyorum, bu yüzden bu benim için çalışacak.
Adrian

ilk düşünce olarak, orijinal uistackview'inizin içinde başka bir uistackview olabilir ve dolguyu ona verebilirsiniz. daha sonra görüşlerinizi bu yeni uistackview'e ekleyin (bunu tamamen arayüz oluşturucu ile yapabilirsiniz, bunun için kod yazmaya gerek yoktur)
William Kinaan

Evet, işe yarayacak. Cevap olarak ekleyebilirsiniz ve ben kabul edeceğim.
Adrian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.