Ich versuche, Ansichten in UIStackView programmgesteuert hinzuzufügen. Im Moment lautet mein Code:
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];
Wenn ich die App bereitstelle, gibt es nur eine Ansicht und sie ist schwarz (Ansicht1 erhält auch die Parameter für Ansicht2).
ios
objective-c
ios9
uistackview
Altimir Antonov
quelle
quelle
addArrangedSubview:
nichtaddSubview:
Antworten:
Stapelansichten verwenden die intrinsische Inhaltsgröße. Verwenden Sie daher Layoutbeschränkungen, um die Abmessungen der Ansichten zu definieren.
Es gibt eine einfache Möglichkeit, Einschränkungen schnell hinzuzufügen (Beispiel):
Vollständiger Code:
Hinweis: Dies wurde unter iOS 9 getestet
quelle
UIViews
nicht der Fall ist . Wenn das OriginalplakatUILabel
stattdessen InstanzenUIView
verwendet hätte, hätte sein Code wie erwartet funktioniert. Ich habe ein Beispiel hinzugefügt, das dies unten demonstriert.Swift 5.0
Basierend auf @ user1046037 Antwort.
quelle
activate(_:)
Regel ist dies effizienter. Developer.apple.com/documentation/uikit/nslayoutconstraint/…UIStackView
Verwendet interne Einschränkungen, um die angeordneten Unteransichten zu positionieren. Welche Einschränkungen erstellt werden, hängt davon ab, wie die Stapelansicht selbst konfiguriert ist. Standardmäßig erstellt eine Stapelansicht Einschränkungen, bei denen die angeordneten Unteransichten in einer horizontalen Linie angeordnet sind und die Vorder- und Nachansichten an den eigenen Vorder- und Hinterkanten befestigt werden. Ihr Code würde also ein Layout erzeugen, das folgendermaßen aussieht:Der jeder Unteransicht zugewiesene Speicherplatz wird durch eine Reihe von Faktoren bestimmt, darunter die inhärente Inhaltsgröße der Unteransicht sowie deren Komprimierungsbeständigkeit und inhaltliche Prioritäten. Standardmäßig
UIView
definieren Instanzen keine intrinsische Inhaltsgröße. Dies wird im Allgemeinen von einer Unterklasse wieUILabel
oder bereitgestelltUIButton
.Da der Inhalt Komprimierungswiderstand und Inhalt umarmen Prioritäten von zwei neuen
UIView
Instanzen gleich sind und keine der beiden Ansichten eine intrinsische Inhaltsgröße bietet, muss die Layout-Engine nach bestem Wissen raten, welche Größe jeder Ansicht zugewiesen werden soll. In Ihrem Fall wird der ersten Ansicht 100% des verfügbaren Speicherplatzes zugewiesen, und der zweiten Ansicht wird nichts zugewiesen.Wenn Sie Ihren Code so ändern, dass
UILabel
stattdessen Instanzen verwendet werden, erhalten Sie bessere Ergebnisse:Beachten Sie, dass es nicht erforderlich ist, selbst explizit Einschränkungen zu erstellen. Dies ist der Hauptvorteil der Verwendung
UIStackView
- es verbirgt die (oft hässlichen) Details des Constraint-Managements vor dem Entwickler.quelle
UIView
sich haben keine intrinsische Größe. Möglicherweise müssen Sie diesen Ansichten zusätzliche Einschränkungen zuweisen, damit die Stapelansicht weiß, wie groß sie sein müssen.MyTextField.top = top+20
undbottom = MyTextField.bottom+20
. Ich würde erwarten, dass dies meiner Ansicht eine intrinsische Höhe von 70 geben würde, aber stattdessen beschwert es sich über widersprüchliche Einschränkungen. Weißt du was hier los ist? Diese Ansicht möchte ich in meine UIStackView einfügen.In Swift 4.2
quelle
Sie müssen Ihren Verteilungstyp festlegen. Fügen Sie in Ihrem Code Folgendes hinzu:
Oder Sie können die Verteilung direkt in Ihrem Interface Builder festlegen. Beispielsweise:
Hoffe das hilft;) Lapinou.
quelle
Die folgenden zwei Zeilen haben mein Problem behoben
Schnelle Version -
quelle
Für die akzeptierte Antwort, wenn Sie versuchen, eine Ansicht in der Stapelansicht auszublenden, funktioniert die Einschränkung nicht korrekt.
Grund ist , wenn die versteckt
view
instackView
es wird die Höhe auf 0 gesetzt , es zu beleben.Lösung Ändern Sie die Einschränkung
priority
wie folgt.quelle
Verbesserte Antwort von @Oleg Popov
quelle
In meinem Fall war das, was ich erwartet hatte, dass mir diese Zeile fehlte:
Danach müssen keine Einschränkungen mehr für meine angeordneten Unteransichten festgelegt werden. Die Stapelansicht kümmert sich darum.
quelle
Swift 5- Version von Oleg Popovs Antwort , die auf der Antwort von user1046037 basiert
quelle
Ich bin gerade auf ein sehr ähnliches Problem gestoßen. Wie bereits erwähnt, hängen die Abmessungen der Stapelansicht von einer intrinsischen Inhaltsgröße der angeordneten Unteransichten ab. Hier ist meine Lösung in Swift 2.x und folgende Ansichtsstruktur:
Ansicht - UIView
customView - CustomView: UIView
stackView - UISTackView
arrangierte Unteransichten - benutzerdefinierte UIView-Unterklassen
quelle
Versuchen Sie unten Code,
Hoffe, es funktioniert. Bitte lassen Sie mich wissen, wenn Sie weitere Erläuterungen benötigen.
quelle