Ich muss etwas schrecklich Offensichtliches hier vermissen, aber das war ein Thema, das mich für DAYS frustriert hat.
In einem iOS-Projekt auf xcode 4.5 habe ich mehrere Labels in einer XIB, eine über der anderen, in einem UIScrollView
, das eine UIView
einnimmt. Jedes Etikett ist so breit wie die Ansicht, und jedes ist ungefähr 20 px über dem nächsten. Gelegentlich hat eines der Labels keine Informationen, daher wird es auf "unsichtbar" gesetzt, und die darunter liegenden Labels sollten nach oben verschoben werden, um die Leerstelle zu belegen.
Das Problem ist, wenn das automatische Layout in der Ansicht deaktiviert ist, bewegen sich die Labels genau so, wie sie sollten, obwohl UIScrollView
nicht mehr scrollt. Wenn es auf ist, bewegen sich die Labels überhaupt nicht, egal was passiert.
Hier ist der Code ... Ich benutze im Grunde nur eine schnelle Funktion, um jedes Etikett um die Höhe des unsichtbaren Etiketts zu verschieben.
%Vor% Wenn es ausgeführt wird, zeigt das NSLog
an, dass Y verschoben wurde, aber es bewegt sich nicht auf dem Bildschirm. Ich bin mir sicher, dass es mit der Einschränkung für den vertikalen Speicherbereich zu tun hat, aber ich kann die Einschränkung nicht löschen, und sie lässt mich nicht von oben in die Ansicht ändern. Wie ich schon sagte, ich bin sicher, dass ich etwas vermisse, aber ich habe alles erschöpft, was ich tun kann ...
Wenn Sie nur ein Etikett haben, das möglicherweise ausgeblendet ist, können Sie die darunter liegenden mit den folgenden Optionen verschieben:
%Vor%Das obere Label hat eine Beschränkung auf den oberen Rand der Bildlaufansicht und alle anderen Labels haben 20 Punkte vertikale Distanzbeschränkungen zu den oberen und unteren. In diesem Beispiel verstecke ich label2. Die Beschriftungen sind alle 34 Punkte hoch. Wenn Sie also die Constraint-Konstante von 20 auf -34 ändern, wird die jetzt verborgene Beschriftung direkt über der darüber liegenden Marke verschoben.
Um diese Methode mit mehreren Etiketten zu verwenden, die ausgeblendet werden können, müssen Sie eine Steckdose für jede der Etiketten, die Sie ausblenden möchten, und ihre Einschränkung für die Beschriftung oben haben. Sie können es tatsächlich tun, ohne Outlets zu den Einschränkungen, aber ich weiß nicht, ob es so robust wäre (es ist möglich, dass es die falsche Einschränkung auswählt). Ich war in der Lage, dasselbe zu tun, indem ich die Beschränkungen durchblätterte, um diejenige zu finden, die zu einer bestimmten Marke gehört, und sie ist diejenige, die an die Spitze dieser Marke gesetzt ist:
%Vor%Die gleiche Methode kann geändert werden, um eine Animation zu verwenden, wenn Sie möchten - der folgende Ausschnitt blendet die Beschriftung aus, die Sie ausblenden möchten, während die Aufwärtsbewegung aller unteren Beschriftungen animiert wird.
%Vor%Wenn das automatische Layout aktiviert ist, können Sie keine Frames für Unteransichten festlegen. Im besten Fall wird es vorübergehend ausgeführt, bis der nächste Layout-Durchlauf erfolgt ist. An diesem Punkt wird das von Ihren Einschränkungen definierte Layout wiederhergestellt.
Sie müssen die Einschränkungen ändern, die in der Ansicht vorhanden sind. In Ihrem Fall wäre es sinnvoll, auf jedem Etikett eine bestimmte Pin-zu-Höhe-Beschränkung zu haben. Sie können dann Outlets für jede dieser Bedingungen erstellen. Für eine Nullhöhe-Beschriftung würden Sie dann die Konstante für die relevante Einschränkung auf Null setzen. Die darunter liegenden Beschriftungen werden dann nach oben verschoben.
Abhängig von der Beschriftung, die Sie entfernen, kann dies zu einer doppelt breiten Lücke führen. Sie können dies entfernen, indem Sie die Abstandsbeschränkungen ändern, oder Sie können die Abstandsbeschränkungen ganz loswerden und haben nur jedes Etikett ein bisschen höher, aber direkt nebeneinander - der Inhalt des Etiketts ist sowieso vertikal zentriert.
Die wichtigste Nachricht ist, dass Sie keine Frames festlegen. Sie ändern, fügen hinzu und / oder entfernen Sie stattdessen Einschränkungen.
Tags und Links objective-c iphone ios autolayout