2015-05-07 15 views
15

In meinen Apps arbeite ich viel mit Constraints, in den meisten Fällen auch mit Animationen. Unter bestimmten Umständen muss ich Einschränkungen entfernen und neue hinzufügen.Korrektes Löschen eines NSLayoutConstraint

Da ich iOS 7 auch unterstützen muss, kann ich die active Eigenschaft nicht verwenden, die sonst die Lösung für mich sein würde.

Die Methode zum Entfernen von Einschränkungen besteht darin, die Methode removeConstraint auf einer UIView zu verwenden.

Ist es möglich, eine Methode, wie

constraint.remove() 

so erstellen Sie müssen nicht wissen, welche Blick über die Einschränkung kümmert?

Antwort

5

Ich habe autoRemove durch die PureLayout Bibliothek zur Verfügung gestellt unter Verwendung des Verfahrens endete: https://github.com/smileyborg/PureLayout

Diese Methode findet die commonSuperview die firstItem oder secondItem mit und entfernt die Einschränkung von der korrekten Ansicht.

Es resultierte in diesem Motto:

containerTopConstraint.autoRemove() 
0

Nein, ich bin mir dessen nicht bewusst. Die automatische Verwaltung der Host-Ansicht kam nur in iOS8.

Eine hässliche Implementierung könnte alle Beschränkungen aller Ansichten durchlaufen, um die Ansicht zu finden, in der sie sich befindet.

Normalerweise sollte es aber nicht so schwierig sein, die Constraints so zu managen, dass man immer weiß, in welcher Ansicht sie definiert sind.

+0

Nun, das ist wahr. Ich weiß, es ist eine von zwei Ansichten. Aber ich möchte diese if-Statements nicht jedes Mal schreiben. Es wäre schöner, eine saubere Lösung dafür zu haben. – Antoine

14

Was ich tue, ist Arrays der Zwänge zu schaffen, die ich möchte der Lage sein, die folgenden hinzufügen/entfernen und einfach zu verwenden:

@property NSMutableArray *newConstraints; 

up Füllen Sie das newConstraints

iOS7 und iOS8:

[self.viewToChange addConstraints:self.newConstraints]; 
[self.viewToChange removeConstraints:self.newConstraints]; 

oder iOS8 nur, verwenden Sie den neuen Mechanismus

[NSLayoutConstraint activateConstraints:self.newConstraints]; 
[NSLayoutConstraint deactivateConstraints:self.newConstraints]; 

Mit diesem können Sie einen Satz anwenden, den Satz entfernen und einen neuen Satz anwenden.

Sie können auch die erste Liste aus dem Storyboard-Satz erstellen, wenn Sie feststellen können, welche Einschränkungen welche sind.

+0

Das ist nicht mein Problem. Das 'viewToChange' ist das Problem, da ich nicht immer weiß, welche Ansicht die Einschränkungen berücksichtigt. Deshalb möchte ich einfach 'constraint.remove()' sagen – Antoine

+0

Entschuldigung, missverstanden. Eine Lösung wäre, alle in einem Wörterbuch relevanten Einschränkungen mit ihrem 'Bezeichner' als Schlüssel und Ansicht als Wert abzubilden. Sie können dann die aktuelle Ansicht finden, indem Sie nach Identifier suchen. Bei handcodierten Constraints können Sie den Identifier im Code setzen. Sie können es auch über IB festlegen: siehe http: // stackoverflow.com/questions/27791597/is-there-a-way-to-add-an-identifier-to-auto-layout-constraints-in-interface-buil –

+0

Ich könnte diesen Bezeichner verwenden, um die Einschränkung zu finden, aber wie soll ich Finden Sie die richtige Ansicht mit dieser Kennung? – Antoine