Dit is mijn setup: ik heb een UIScrollView
met leading,top, trialing edge ingesteld op 0. Hierbinnen voeg ik een UIStackView
toe 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 isLayoutMarginsRelativeArrangement
waar 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).
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:
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 spacing
om 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
}
}