Hoe voeg je voorloopopvulling toe aan weergave toegevoegd in een UIStackView

Dit is mijn setup: ik heb een UIScrollViewmet leading,top, trialing edge ingesteld op 0. Hierbinnen voeg ik een UIStackViewtoe met deze beperkingen:

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

In de stapelweergave voeg ik enkele weergaven toe.
Mijn probleem is dat vanwege de beperkingen de eerste weergave die aan de stapelweergave is toegevoegd, ook leading edge = 0 heeft.

Op welke manieren kan ik wat opvulling toevoegen aan de eerste weergave? Zonder de beperkingen van de scrollweergave aan te passen.


Antwoord 1, autoriteit 100%

Als de eigenschap isLayoutMarginsRelativeArrangementwaar is, zal de stapelweergave de gerangschikte weergaven opmaken ten opzichte van de opmaakmarges.

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

Maar het heeft invloed op alle gerangschikte weergaven binnenin de stapelweergave. Als u deze opvulling voor slechts één gerangschikte weergave wilt, moet u geneste UIStackView

gebruiken


Antwoord 2, autoriteit 39%

Ik heb ontdekt dat beperkingen niet werken in een stapelweergave, of ze lijken wat vreemd.

(Als ik voorloop-/achterloopbeperkingen toevoeg aan geselecteerd op afbeeldingsstapelweergave, dan voegt dat ook leiden toe aan collectieweergave, maar voegt geen volgvolgorde toe; en het is zeker een conflict).

stackview binnen stackview

Als u lay-outmarges voor alle weergaven in de stapelweergave wilt instellen, selecteert u:

Stack View > Size Inspector > Layout Margins > Fixed

Opmerking: de optie "Fixed"heette voorheen "Explicit", zoals te zien is in de schermafbeeldingen.

Voeg vervolgens uw opvulling toe:

storyboard


Antwoord 3, autoriteit 7%

De oplossing die je hebt gegeven, voegt geen opvulling toe voor je weergaven in je UIStackView (zoals je wilde in de vraag), maar het voegt een lead toe voor de UIStackView.

Een oplossing zou kunnen zijn om nog een UIStackView toe te voegen aan je originele UIStackView en de leiding te geven aan deze nieuwe UIStackVIew. Voeg vervolgens uw weergaven toe aan deze nieuwe UIStackView.

Hint, u kunt dat volledig doen met Interface Builder. Met andere woorden, u hoeft er geen code voor te schrijven.


Antwoord 4, autoriteit 4%

Wat voor mij werkte, is om aan de stapelweergave een andere UIView toe te voegen die slechts een spacer is (werkt in ieder geval met stackView.distribution = .Fill):

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

Antwoord 5

Als u alleen voorloopopvulling nodig heeft, kunt u de uitlijning van de stapelweergave instellen op “Trailing” en dan bent u vrij om unieke voorloopbeperkingen op te geven voor elk van de daarin opgenomen subweergaven.

Als bonus kun je ook de uitlijning van de stapelweergave instellen op “Center” en dan kun je voorloop- en/of volgbeperkingen gebruiken om elk item zijn eigen opvulling aan beide kanten te geven.


Antwoord 6

snel 3:
U hoeft alleen de offset in te stellen door:

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

Zorg ervoor dat deze beperking wordt ingesteld nadat u parentView.addArrangdSubView(firstView)


Antwoord 7

Stel uw stackview-uitlijning in op “midden”. Daarna kun je elke subview een andere voor- en achterloop geven.


Antwoord 8

De oplossing zou zijn om een ​​normale weergave in de stapelweergave te hebben voor alle weergaven waaraan u beperkingen wilt toevoegen, en dan kunt u beperkingen toevoegen voor uw items die relatief zijn aan de weergaven in de stapelweergave. Op die manier kunnen uw originele weergaven voorloop- en volgbeperkingen hebben binnen de stapelweergave.

Dit kan worden gedaan in de interface-builder en programmatisch.


Antwoord 9

Deze vraag heeft al goede antwoorden,
Een suggestie is echter: gebruik de eigenschap spacingom de afstand tussen de weergaven in te stellen. Voor de eerste en de laatste weergave kunnen er twee opties zijn: ofwel insets instellen zoals @tolpp suggereerde of een beperking toevoegen aan de bovenliggende (stackview) met constante om opvulling toe te voegen.


Antwoord 10

Wat we deden was transparante componenten toevoegen (bijv. UIButton/UIView) als de eerste en laatste kinderen van de UIStackView. Stel vervolgens de breedte van deze onzichtbare kinderen in om de opvulling aan te passen.


Antwoord 11

Het lijkt erop dat de oplossing vrij eenvoudig was. In plaats van:

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

Ik schreef net:

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

Antwoord 12

Voeg gewoon een lege weergave toe aan het begin van de stapelweergave (beperk ook de breedte en/of hoogte):

stackView.insertArrangedSubview(UIView().constrain(width: 0, height: 0), at: 0)

en/of aan het einde:

stackView.addArrangedSubview(UIView().constrain(width: 0, height: 0))

Ik heb deze eenvoudige UIView-extensie gemaakt om de beperkingen toe te voegen:

extension UIView {
    func constrain(width: CGFloat, height: CGFloat) -> Self {
        NSLayoutConstraint.activate([
            widthAnchor.constraint(equalToConstant: width),
            heightAnchor.constraint(equalToConstant: height)
        ])
        return self
    }
}

Other episodes