Quindi, avete questo:
e il problema è , quando si primo crollo della pila interna, si ottiene auto errori di layout:
2017-07-02 15:40:02.377297-0500 nestedStackViews[17331:1727436] [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x62800008ce90 'UISV-canvas-connection' UIStackView:0x7fa57a70fce0.top == UILabel:0x7fa57a70ffb0'Top Label of Inner Stack'.top (active)>",
"<NSLayoutConstraint:0x62800008cf30 'UISV-canvas-connection' V:[UILabel:0x7fa57d30def0'Bottom Label of Inner Sta...']-(0)-| (active, names: '|':UIStackView:0x7fa57a70fce0)>",
"<NSLayoutConstraint:0x62000008bc70 'UISV-hiding' UIStackView:0x7fa57a70fce0.height == 0 (active)>",
"<NSLayoutConstraint:0x62800008cf80 'UISV-spacing' V:[UILabel:0x7fa57a70ffb0'Top Label of Inner Stack']-(8)-[UILabel:0x7fa57d30def0'Bottom Label of Inner Sta...'] (active)>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x62800008cf80 'UISV-spacing' V:[UILabel:0x7fa57a70ffb0'Top Label of Inner Stack']-(8)-[UILabel:0x7fa57d30def0'Bottom Label of Inner Sta...'] (active)>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
il problema, come avrete notato, è che la vista dello stack esterno applica un HEIG ht = 0 vincolo alla vista pila interna. Ciò è in conflitto con il vincolo di riempimento di 8 punti applicato dalla vista dello stack interno tra le proprie sottoview. Entrambi i vincoli non possono essere soddisfatti contemporaneamente.
La vista pila esterna utilizza questo vincolo altezza = 0, credo, perché sembra meglio quando è animato che lasciare che la vista interna sia nascosta senza restringersi prima.
C'è una semplice soluzione per questo: avvolgere la vista della pila interna in un semplice UIView
e nascondere tale wrapper. Dimostrerò.
Ecco lo schema scena per la versione rotto sopra:
Per risolvere il problema, selezionare la vista interna di stack. Dalla barra dei menu, scegliere Editor> Incorpora in> Vista:
Interface Builder ha creato un vincolo di larghezza sulla vista involucro quando ho fatto questo, in modo da eliminare il vincolo di larghezza:
Avanti, crea vincoli tra i quattro bordi dell'involucro e la vista pila interna:
A questo punto, il layout è effettivamente corretto in fase di esecuzione, ma Interface Builder lo disegna in modo errato. Puoi sistemarlo impostando le priorità di abbraccio verticale dei bambini dello stack interno più in alto. Li ho impostata su 800:
non abbiamo in realtà risolto il problema vincolo insoddisfacibile a questo punto. Per fare ciò, trova il vincolo di fondo che hai appena creato e imposta la sua priorità a meno del necessario. Cambiamo a 800:
Infine, è presumibilmente avuto una presa nel vostro controller della vista collegata alla vista interna di stack, perché stavi cambiando la sua proprietà hidden
. Cambia quella presa per connetterti alla vista del wrapper invece della vista della pila interna. Se il tipo di presa è UIStackView
, sarà necessario cambiarlo in UIView
.Il mio era già di tipo UIView
, quindi ho solo ricollegata nella storyboard:
Ora, quando si alternare proprietà hidden
della vista involucro, viene visualizzata la vista dello stack al collasso, con nessun avviso vincolo insoddisfacibile. Sembra praticamente identico, quindi non mi preoccuperò di pubblicare un'altra GIF dell'applicazione in esecuzione.
È possibile trovare il mio progetto di prova in this github repository.
grazie, ci provo oggi e accetto la risposta se funziona :) –