2014-12-31 14 views
17

Ich habe gegoogelt, aber nicht die Antwort gefunden. Also muss ich fragen. Ich habe einen Startbildschirm. Wenn der Benutzer angemeldet ist, wird eine Ansicht wie unten angezeigt: Jetzt, wenn der Benutzer sich abmeldet und die Homepage besucht, sieht er das obige Layout, aber ohne Center Boxed Layout. Wenn ich das Layout ausgeblendet habe, wird es jetzt wie folgt angezeigt. enter image description hereWie programmatisch bedingte Einschränkungen entfernen, die vom Storyboard hinzugefügt werden?

Ich möchte über drittes Layout zu wenig bewegen, Leerraum zu entfernen ..

I Einschränkungen hinzugefügt Storyboard verwenden. Jetzt müssen Sie Einschränkungen aus der Programmierung entfernen und eine Einschränkung hinzufügen, die das Layout auf das erste Layout setzt.

+0

dieses Blogs: http://stackoverflow.com/questions/17867125/uistoryboard-how-to-replace-constraints-programmatically –

+0

@Mrunal. Ja, ich arbeite tatsächlich daran .. Ich bekomme einige Warnungen über Einschränkungen im Protokoll .. – Dharmik

Antwort

9

Nehmen Sie das IBOutlet der Höhenbeschränkung der Ansicht, die Sie ausblenden möchten, wenn sich der Benutzer abmeldet.

@property(weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight; 

Es ist eine Eigenschaft Konstante in NSLayoutConstraint Klasse. Sie müssen es festlegen, wenn sich der Benutzer an-/abmeldet.

viewHeight.constant = isLoggedIn ? 30.0 : 0.0; 

this helps ..

19

Wie @Henit erwähnt, können Sie IBOutlet für bedingten Einschränkungen sowie gesetzt.

Zum Beispiel

@property(weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight; 

so jetzt, können Sie diese Einschränkung wie folgt entfernen:

[myView removeConstraint: viewHeight]; 

wenn Sie dann

, zu Ihrer Ansicht im Zusammenhang mehrere Einschränkungen entfernen möchten oder auch alle/
[myView removeConstraints: constraintsArrayHere]; // custom array of constraints references 
[myView removeConstraints: [myView constraints]]; //all constraints 

Dann können Sie später Ihre neuen Einschränkungen auf die gleiche Weise mit addConstraint oder hinzufügen Methode.

Für weitere Informationen gehen Sie durch Apple-Dokumentation here.

Hoffnung, das hilft.

1

Sie können es auch auf andere Weise tun. Fügen Sie eine Beschränkung für den vertikalen Abstand zwischen dem dritten Layout und dem ersten Layout hinzu, die 30 ist. Fügen Sie dann im Controller einen Verweis auf die Einschränkung hinzu.

self.verticalSpacingFromThirdToFirstConstraint.constant = isLoggedIn ? 30.0 : 0.0 

PS: Sie sollten in diesem Fall keine Höhenbeschränkung für die mittlere Ansicht hinzufügen. Fügen Sie einfach die vier nachfolgenden, führenden, oberen (zum ersten Layout) und unteren (zum dritten Layout) hinzu.

10

removeConstraints wird in Zukunft veraltet sein.

Sie können die folgenden als Alternative

viewHeight.active = NO; 
0

Sie verwenden eine Höhe Einschränkung für diese Ansicht hinzufügen können Sie ausblenden möchten. Und fügen Sie eine NSlayoutHeightcontraint Steckdose für diese Höhenbeschränkung in Ihrer viewcontroller.h Datei hinzu. Dann können Sie das heightConstrain Outlet in Ihrer viewcontroller.m-Datei aufrufen, wo immer Sie möchten. Fügen Sie diesen Code, wo Sie diese ausblenden möchten UIview:

_heightconstrainOutlet.constant=0; 

Es wird die Höhe Null werden lassen. Also wird Ihre Ansicht von unten auch diesen Bereich abdecken. Wenn Ihre untere Ansicht eine Beschränkung für die Höhe und die Einschränkung für den unteren Platz für die Container aufweist? Entfernen Sie einfach eine von ihnen als Ihre Anforderung Danke

8

erweitern auf @ Megamind Antwort: Sie können die active Eigenschaft NSLayoutConstraint nutzen können. Richten Sie einfach zwei verschiedene Einschränkungen für die beiden Fälle ein und aktivieren Sie je nach Anmeldestatus nur eine davon. In Interface die active Eigenschaft ist seltsam Installed genannt:

Login constraintRegister constraint

Dann im Code-Schalter zwischen den beiden:

- (void)setupRegistrationView 
{   
    _loadingIndicatorTopConstraintLogin.active = NO; 
    _loadingIndicatorTopConstraintRegister.active = YES; 
} 

- (void)setupLoginView 
{   
    _loadingIndicatorTopConstraintLogin.active = YES; 
    _loadingIndicatorTopConstraintRegister.active = NO; 
} 

BTW, für eine elegantere Lösung kann bieten die neuen UIStackView mit Ihr Fall, aber das ist ein anderes Thema.

+0

Lebensretter Mann! –

1

Es ist ziemlich einfach von iOS 10+ können Sie einfach über alle Beschränkungen einer Ansicht iterieren und sie deaktivieren. Wenn Sie, z.B. wollen die Höhe Beschränkung einer Ansicht zu finden und entfernen Sie folgendes tun:

for constraint in constraints { 
    guard constraint.firstAnchor == heightAnchor else { continue } 
    constraint.isActive = false 
    break 
} 

ALTERNATIVE
Es ist sogar ein Einzeiler. Wenn Sie in Ihrer Ansicht sind, können Sie einfach schreiben:

constraints.first { $0.firstAnchor == heightAnchor }?.isActive = false 
+1

sollte dies akzeptiert werden – JohannaNoobie

Verwandte Themen