2014-03-13 4 views
7

Ich bin etwas ratlos, wie man Einschränkungen richtig definiert, die den Abstand zwischen den Ansichten reduzieren, wenn eine bestimmte Ansicht entfernt wird. Ich habe versucht, vertikale Beschränkungen mit einer größeren als oder gleichen Beziehung hinzuzufügen, jedoch scheint es, dass der minimale Abstand, um die Beschränkung zu erfüllen, nicht bevorzugt ist.Automatisches Ausblenden von Leerräumen beim Entfernen von Zwischenansichten

Zum Beispiel, angesichts der folgenden Layout mit drei Einschränkungen V: [A] -5- [B], V: [B] -5- [C] und V: [A] - (> = 5) - [C]:

[ View A ] 
    | 
    5 pt 
    | 
[ View B ] 
    | 
    5 pt 
    | 
[ View C ] 

nach Ansicht Entfernen von BI wollen es so aussehen:

[ View A ] 
    | 
    5 pt 
    | 
[ View C ] 

Aber es sieht wie folgt aus:

[ View A ] 
    | 
    5 pt + 5 pt + height of view B 
    | 
[ View C ] 
+4

+1 für eine klare und sauber formatierte Frage – Eugene

+0

Entfernen Sie die Ansicht B oder verstecken Sie sie einfach? Müssen Sie es irgendwann wiederherstellen? –

Antwort

3

Wenn Sie nach skalierbar suchen, müssen Sie es wahrscheinlich in Code tun. Ich benutze so etwas wie

UIView *superView = /* whatever the superview of your views is, probably self.view in a lot of cases */ 
NSArray *arrViews = [NSArray arrayWithObjects:/* put only the things you want to show in here, do not put the hidden things, and put them in order from top to bottom */, nil]; 
CGFloat buffer = 5; 

[superView addConstraint:[NSLayoutConstraint constraintWithItem:[arrViews objectAtIndex:0] attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeTop multiplier:1 constant:buffer]]; 
for (int i = 1; i < arrViews.count; i++) 
{ 
    [superView addConstraint:[NSLayoutConstraint constraintWithItem:[arrViews objectAtIndex:i] attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:[arrViews objectAtIndex:i-1] attribute:NSLayoutAttributeBottom multiplier:1 constant:buffer]]; 
} 
[superView addConstraint:[NSLayoutConstraint constraintWithItem:[arrViews lastObject] attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeBottom multiplier:1 constant:-1*(buffer)]]; 

Dies wird einen festen Abstand setzen (von size = buffer) zwischen dem oberen Element und es ist Superview, dann zwischen den einzelnen subview und dem subview direkt darüber, dann zwischen der Untersicht und der Super . Sie müssen dies jedes Mal anrufen, wenn Sie einen Artikel aus arrViews entfernen, dann rufen Sie [superView needsLayout]. Sie müssen auch sicherstellen, dass Höhenbeschränkungen irgendwie festgelegt sind, oder Sie erhalten Fehler. Wenn alles die gleiche Höhe hat, können Sie einfach eine weitere Zeile in die Schleife einfügen, um eine Höhenbeschränkung hinzuzufügen.

8

Sie V könnte hinzufügen: [A ] -5- [C] mit einer Liebhaberpriorität, unten 1000.

[superview] 
    | 
[ View A ] 
    |    | 
    5 pt (1000) | 
    |    | 
[ View B ]  5 pt (999) 
    |    | 
    5 pt (1000) | 
    |    | 
[ View C ]   
+0

Dieser Ansatz wird Spam "die gleichzeitige Bedingungen nicht erfüllen können." Warnungen. Der andere Nachteil ist, dass es nicht besser skaliert, je mehr Ansichten Sie vertikal hinzufügen. –

+0

@JackRowlingson Mit diesem Ansatz habe ich ein Testprojekt erstellt - keine Warnungen. Sieht so aus, als hättest du andere widersprüchliche Einschränkungen. Schätze, du hast View C irgendwie auf den Boden gerissen. –

1

Sie müssen die Einschränkungen programmatisch neu zu verkabeln, so dass View C ‚s Einschränkung View B Punkte zu View A statt, und stellen Sie sicher, die Einschränkung View A-View B entfernt wird. Nachdem Sie dies getan haben, rufen Sie layoutIfNeeded auf der Super-View, die diese Ansichten enthält.

Verwandte Themen