2016-06-18 25 views
1

in meinem Programm habe ich 14 verschiedene Tasten mit einem Buchstaben jeweils. Und jede einzelne Taste ist mit Auto-Layout miteinander verbunden. Es gibt also viele Einschränkungen. Siehe erstes Bild zur Erläuterung:Auto-Layout und Animation

enter image description here

Aber ich möchte in der Lage, jede einzelne Taste hin und her durch UIAnimation ohne vermasselt die ganze Auto-Layout-Setup zu bewegen. Siehe zweites Bild zur Erläuterung, was ich tun möchte:

enter image description here

Jetzt ist der Code, den ich verwenden, um zur Zeit diese Animation zu erhalten:

self.letterA.translatesAutoresizingMaskIntoConstraints = YES; 
[UIView animateWithDuration:0.2 animations:^{ 
    [letterA setFrame:CGRectMake(x, y, width, height)]; 
}]; 

Jetzt wird das Programm funktioniert perfekt! Absolut keine Probleme! Aber das einzige „Problem“ ist dieser Code diese Meldung in der Konsole erzeugt:

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. 
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 

Und diese Warnung/Fehler/Problem auf und weiter und weiter mehrmals geht, jedes Mal ein UIButton bewegt. Was soll ich jetzt tun?

  1. Kann ich die Unable to simultaneously satisfy constraints ignorieren? Oder wird das Ärger auf der Straße verursachen?
  2. Wenn nicht, wie man es repariert? Und da es verrückte Mengen an Constraints gibt, wie kann es behoben werden, ohne jeden einzelnen Constrain zu bearbeiten?
  3. Ich möchte sehr viel Animieren halten setFrame:

Antwort

2

Um Ihre Punkte:

  1. „Kann ich das kann nicht ignorieren, um gleichzeitig Einschränkungen erfüllen Warnung“ Nein. Es ist eine wirklich schlechte Idee, dies zu ignorieren, auch wenn die Benutzeroberfläche mehr oder weniger erscheint, wie Sie wollen es sogar mit der Warnung. Dies bedeutet, dass das System entscheidet, wie das Layout gerendert wird, da die von Ihnen gelieferten Anweisungen widersprüchlich sind. Es hat die von Ihnen bereitgestellten Einschränkungen analysiert und einen Weg gefunden, um ein konsistentes Layout zu erstellen, indem Sie eines oder mehrere von ihnen brechen. Es gibt keine Garantie, dass es sich entscheidet, die gleichen Einschränkungen für verschiedene Bildschirmgrößen oder Betriebssystemversionen zu umgehen. Das Ignorieren dieser Warnung erhöht die Wahrscheinlichkeit von UI-Fehlern massiv.

  2. Ich würde die ganze Art, wie diese UI entworfen wird, überdenken. IB/Storyboard Auto-Layout funktioniert gut für UIs bis zu einem gewissen Grad an Komplexität. Diese UI scheint etwas komplexer zu sein - wenn die Kacheln nicht bewegt werden müssten, wäre das in Ordnung. Da sie dies tun, kann programmatisches automatisches Layout die Dinge vereinfachen. Der Ansatz, den ich nehmen würde, wäre wie folgt.

    a. Erstellen Sie ein Kachelobjekt, das NSLayoutConstraint Eigenschaften für obere, linke, Breite und Höhe Einschränkungen zur Verfügung stellt. (Diese Einschränkungen würden in der Superview hinzugefügt, aber auch auf der Kachel selbst gespeichert).

    b. Richten Sie die Ansichten mit einer Factory-Objektmethode ein, wobei Sie die Anfangsposition, den Offset, die Breite und die Höhe der neuen Kachel als Parameter verwenden. Verwenden Sie diese Werte, um die Einschränkungen für jede Kachel unabhängig voneinander festzulegen. Beschränken Sie die Kacheln nicht aufeinander - alle Constraints sollten entweder intern (Breite, Höhe) oder relativ zur Superansicht (x, y) sein. Dies bedeutet, dass beim Animieren von Änderungen nur eine Kachel betroffen ist. Sie haben tatsächlich mehr Einschränkungen, aber sie sind in Code und daher einfacher zu verwalten.

    c). Verwenden Sie UIView Animationen, um die Kacheln zu verschieben und ihre Größe mit den Beschränkungen der Kacheln zu ändern. Sie können die anfänglichen Rahmen für jede Kachelposition speichern und diese Werte zum Bestimmen der Zieleinschränkungswerte verwenden. Sie sollten auf diese Weise die Position und Größe der Kacheln leicht ändern können.

    d). Apples API für NSLayoutConstraint ist ein bisschen ausführlich und hässlich. Erwägen Sie die Verwendung von Masonry, einem netteren Auto-Layout-DSL, um Ihren Code sauber zu halten.

  3. Sie können weiterhin -setFrame: verwenden, solange Sie nicht Autolayout verwenden - die beiden Ansätze spielen einfach nicht gut zusammen. Wenn Sie möchten, dass Ihre App auf mehr als einer Bildschirmgröße ausgeführt wird, müssen Sie Autolayout verwenden oder jeden Frame und jeden Offset dynamisch im Code neu berechnen. Wenn Sie es nicht tun (vielleicht ist es eine iPad App und Sie interessieren sich nicht für den Pro, dann verwenden Sie einfach -setFrame:). Aber, im Gleichgewicht würde ich raten, die Kugel zu beißen und gerade Autolayout

zu lernen
1

Verwendung Wenn Ihr mit Auto-Layout können Sie die translateAutoResizingMask auf false gesetzt sollte sonst behalten Sie diesen Fehler. Stattdessen sollten Sie den neuen Speicherort nur mithilfe von Einschränkungen festlegen, bevor der Animationsblock layoutIfNeeded im Animationsblock aufruft. Wenn Sie die Einschränkungen im Schnittstellen-Generator festlegen, bewirkt dies, dass translateAutoResizingMaskToConstraints automatisch auf false gesetzt wird.