UIStackView - Layouteinschränkungen beim Verstecken von Stack-Ansichten
Meine app hat 2 Bildschirme:
- TableViewVC (kein stack Ansichten hier)
- DetailVC (alle geschachtelten stack-Ansichten hier; bitte siehe link für Bild: Verschachtelte StackViews Bild) -- Hinweis: Beschriftungen und Bilder innerhalb dieser Stapel Ansichten.
Wenn Sie drücken Sie auf eine Zelle im tableview, es geht die Informationen aus dem TableViewVC der DetailVC. Das problem ist mit versteckt die spezifischen UIStackViews in der DetailVC. Ich will nur 2 stack-Ansichten aus den verschiedenen in der DetailVC ausgeblendet werden, sobald die Ansicht geladen. Also Schreibe ich diesen code in der DetailVC, dies zu erreichen:
override func viewDidLoad() {
super.viewDidLoad()
self.nameLabel.text = "John"
self.summaryStackView.hidden = true
self.combinedStackView.hidden = true
}
Sieht alles toll aber Xcode geben viele Warnungen nur bei Laufzeit. Es gibt keine Warnung im Storyboard, wenn die app nicht läuft. Hier finden Sie den link zum Bild des errors: Bild von Fehler
Im Grunde ist es eine Menge UISV verbergen, UISV-Abstand, UISV-canvas-Verbindung Fehler. Diese Fehler verschwinden, wenn ich mich verstecken den gleichen stack Blick in viewDidAppear
aber dann gibt es einen flash von dem Zeug, das soll ausgeblendet werden, und dann wird es versteckt. Der Benutzer sieht das die anzeigen kurz auf und dann ist er versteckt, das ist nicht gut.
Sorry für nicht in der Lage, um tatsächlich Bilder anstelle von links, noch nicht so.
Irgendwelche Vorschläge, wie man dieses Problem beheben? Das ist für eine app, die ich wirklich wollen, zu starten, um die app store - es ist mein erstes, so dass jede Hilfe wäre toll!
Edit/Update 1:
Ich fand eine kleine Arbeit, um mit diesem code die ich in den zweiten Bildschirm aufgerufen DetailVC:
//Function I use to delay hiding of views
func delay(delay: Double, closure: ()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}
//Hide the 2 stack views after 0.0001 seconds of screen loading
override func awakeFromNib() {
delay(0.001) { () -> () in
self.summaryStackView.hidden = true
self.combinedStackView.hidden = true
}
}
//Update view screen elements after 0.1 seconds in viewWillAppear
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
delay(0.1) { () -> () in
self.nameLabel.text = "John"
}
}
Dieser entledigt sich die Warnungen über die layout-constraints vollständig von Xcode.
Es ist noch nicht perfekt, weil manchmal sehe ich einen Einblick in die Ansichten, die eigentlich im verborgenen-Sie flash wirklich schnell auf dem Bildschirm dann wieder verschwinden. Dies geschieht so schnell, obwohl.
Irgendwelche Vorschläge, warum dies entledigt Warnungen? Auch alle Vorschläge zur Verbesserung dieser perfekt funktionieren??? Danke!
InformationsquelleAutor der Frage JEL | 2015-11-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie versucht, dies ruft die super nach deinen änderungen?
InformationsquelleAutor der Antwort adamek
Ich hatte das gleiche problem und habe es behoben, indem die Höhe Einschränkungen meiner zunächst ausgeblendete Ansichten, die die Priorität 999.
Das problem ist, dass Ihr stackview gilt eine Höhe Einschränkung von 0 auf Ihre versteckten anzeigen, die in Konflikt mit Ihren anderen Höhe Zwang. Dies war die Fehlermeldung:
Angabe Ihrer Höhe Einschränkung eine geringere Priorität löst dieses problem.
InformationsquelleAutor der Antwort Raphael
Dies ist ein bekanntes problem mit dem ausblenden von geschachtelten stack-Ansichten.
Gibt es im wesentlichen 3 Lösungen für dieses problem:
innerStackView.removeFromSuperview()
aber dann müssen Sie sich daran zu erinnern, wo zum einfügen der übersicht.Die 3. option ist die beste meiner Meinung nach. Für weitere Informationen über dieses problem, warum es passiert, die verschiedenen Lösungen, und wie zu implementierende Lösung 3, siehe meine Antwort auf eine ähnliche Frage.
InformationsquelleAutor der Antwort Senseful
Können Sie die removeArrangedSubview und removeFromSuperview Eigenschaft von UIStackView.
In Objective-C :
Vom Apple UIStackView Dokumentation:(https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIStackView_Class_Reference/#//apple_ref/occ/instm/UIStackView/removeArrangedSubview🙂
Die stack-Ansicht automatisch aktualisiert, das layout, Wann immer Ansichten Hinzugefügt, entfernt oder eingefügt in die arrangedSubviews array.
Um zu verhindern, dass die anzeigen erscheinen auf dem Bildschirm nach dem Aufruf der stack ist removeArrangedSubview: Methode, explizit entfernen Sie die Ansicht aus der Untersichten array durch aufrufen der Ansicht removeFromSuperview Methode, oder legen Sie die view-die hidden-Eigenschaft auf JA.
InformationsquelleAutor der Antwort Microprocessor8085
Wenn die UIViewStack ausgeblendet ist, werden die Einschränkungen automatisch durch die UIStackView werfen viele UISV verbergen, UISV-Abstand, UISV-canvas-Verbindung Warnungen, wenn die UIStackView - spacing-Eigenschaft hat einen anderen Wert als null.
Nicht viel Sinn, ist es fast sicher ein framework Fehler. Der workaround, den ich verwenden ist, legen Sie den Abstand auf null, wenn ausblenden der Komponente.
InformationsquelleAutor der Antwort Berthier Lemieux
Zog ich alle UIStackView.versteckten code aus viewDidLoad zu viewDidAppear und gebrochen Zwänge problem ging Weg. In meinem Fall alle in Konflikt stehenden Einschränkungen wurden automatisch generiert, so dass keine Möglichkeit zur Anpassung der Prioritäten.
Ich habe auch diesen code, um ihn hübscher zu machen:
EDIT:
Brauchten auch Sie den folgenden code, um zu verhindern, dass es wieder passiert, wenn das Gerät gedreht wird:
InformationsquelleAutor der Antwort tigaris
Ich behoben, indem Sie das ausblenden von Befehlen in traitCollectionDidChange.
InformationsquelleAutor der Antwort aqubi
Habe ich herausgefunden, dass verschachtelte UIStackViews dieses Verhalten zeigen, wenn Sie die verborgene Eigenschaft in ✨Interface Builder✨. Meine Lösung war, alles, was nicht versteckt in ✨Interface Builder✨ und verstecken die Dinge in viewWillAppear selektiv.
InformationsquelleAutor der Antwort Jacob Jennings
Setzen Sie Ihre hide Befehle in
viewWillLayoutSubviews() {}
InformationsquelleAutor der Antwort Tim
Dieser Fehler nicht zu verstecken, sondern um mehrdeutige constraints. Sie dürfen keine mehrdeutige Einschränkungen in Ihrem Blick.
Wenn Sie fügen Sie programmgesteuert Sie sollten genau verstehen, welche Einschränkungen Sie hinzufügen und wie Sie zusammen arbeiten.
Wenn Sie nicht fügen Sie programmgesteuert, sondern verwenden Sie die storyboard-oder xib, das ist ein guter Ort, um zu starten, stellen Sie sicher, es gibt keine Einschränkung, Fehler oder Warnungen.
UPD: Sie haben eine ziemlich komplexe Struktur, in der Ansichten. Ohne zu sehen, die Zwänge, ist schwer zu sagen was genau falsch ist. Allerdings würde ich vorschlagen, zu erstellen Sie view-Hierarchie schrittweise hinzufügen von Ansichten ein und so sicherzustellen, dass es keine design-Zeit/Laufzeit-Warnungen.
Scrollen Sie Ansicht hinzufügen einer anderen Ebene der Komplexität, wenn Sie nicht behandeln, es richtig. Finden Sie heraus, wie die Verwendung von constraints mit einem scroll-Ansicht.
Alle anderen timing-hacks ist nicht eine Lösung irgendwie.
InformationsquelleAutor der Antwort Davyd