Ich habe eine Ansicht, deren Rahmen programmgesteuert bearbeitet werden muss - es ist eine Art Dokumentansicht, die den Inhalt umschließt und dann durch Bearbeiten des Rahmenursprungs durch eine Übersicht gescrollt und gezoomt wird. Autolayout kämpft zur Laufzeit damit.
Das vollständige Deaktivieren des automatischen Layouts scheint etwas schwierig zu sein, da es vernünftigerweise verwendet werden kann, um das Layout für die anderen Ansichten zu verwalten. Es scheint, als ob ich eine Art "Null-Einschränkung" haben möchte.
quelle
Ich hatte ein ähnliches Problem, bei dem Autolayout einige meiner Frame-Einstellungen zur Laufzeit überschrieb (ich hatte eine dynamische Ansicht, die in einigen Fällen einen neuen Ansichts-Controller drückte ... Durch Drücken und anschließendes Drücken von Zurück wurde die ursprüngliche Ansicht zurückgesetzt).
Ich habe dies umgangen, indem ich meinen Manipulationscode in
viewDidLayoutSubviews
meinen View Controller eingegeben habe. Dies scheint aufgerufen zu werden, nachdem die Einschränkung mojo aufgerufen wurde, jedoch vor viewDidAppear, sodass der Benutzer nicht klüger ist.quelle
Vielleicht Einstellung nur
translatesAutoresizingMaskIntoConstraints
zuYES
(und nicht zusätzliche Einschränkungen Hinzufügen dieser Ansicht zu beeinflussen) lassen Sie den Rahmen gesetzt , ohne das Auto - Layout - System zu kämpfen.quelle
In iOS 8 können Sie eine NSLayoutConstraint so einstellen, dass sie aktiv ist oder nicht. Wenn ich also den Interface Builder verwende, füge ich alle meine Einschränkungen einer OutletCollection hinzu und aktiviere oder deaktiviere sie dann mit:
Die spezielle Anwendung, für die ich sie hier verwende, hat unterschiedliche Einschränkungen im Hoch- und Querformat und ich aktiviere / deaktiviere sie basierend auf der Drehung des Geräts. Dies bedeutet, dass ich einige komplexe Layoutänderungen im Interface Builder für beide Ausrichtungen erstellen und trotzdem das automatische Layout ohne den ausführlichen automatischen Layoutcode verwenden kann.
Oder Sie können mit removeConstraints und addConstraints aktivieren / deaktivieren.
quelle
Ich weiß nicht, ob dies jemand anderem helfen wird, aber ich habe eine Kategorie geschrieben, um dies zu vereinfachen, da ich dies häufig tue.
UIView + DisableAutolayoutTemporARY.h
UIView + DisableAutolayoutTemporARY.m
Ich benutze es so:
Ich hoffe es hilft.
quelle
Sie können den
translatesAutoresizingMaskIntoConstraints
TypBoolean
Wert Ja in den benutzerdefinierten Laufzeitattributen der gewünschten UIView im xib / storyboard festlegen.quelle
Sie können sich auf mehrere Storyboards aufteilen, wenn Sie für einige Ansichten das automatische Layout verwenden möchten.
quelle
Für mich hat es funktioniert, die Unteransicht programmgesteuert zu erstellen. In meinem Fall hat das automatische Layout eine Ansicht durcheinander gebracht, die ich um die Mitte drehen musste, aber nachdem ich diese Ansicht programmgesteuert erstellt habe, hat es funktioniert.
quelle
Aus meiner Sicht hatte ich ein Etikett und einen Text. Das Etikett hatte eine Schwenkgeste. Das Etikett bewegt sich beim Ziehen gut. Wenn ich jedoch die Textfeldtastatur verwende, setzt das Etikett seine Position auf die ursprüngliche Position zurück, die im automatischen Layout definiert ist. Das Problem wurde behoben, als ich schnell Folgendes für das Etikett hinzufügte. Ich habe dies in viewWillAppear hinzugefügt, aber es kann praktisch überall dort hinzugefügt werden, wo Sie Zugriff auf das Zielfeld haben.
quelle
Dies ist mir in einem Projekt ohne Storyboards oder XIB-Dateien passiert. Alle 100% Code. Ich hatte unten ein Werbebanner und wollte, dass die Ansichtsgrenzen beim Werbebanner anhalten. Die Größe der Ansicht wird nach dem Laden automatisch geändert. Ich habe jede Auflösung auf dieser Seite ausprobiert, aber keine davon hat funktioniert.
Am Ende habe ich nur eine Unteransicht mit der verkürzten Höhe erstellt und diese in die Hauptansicht des Controllers eingefügt. Dann ging mein gesamter Inhalt in die Unteransicht. Das löste das Problem sehr leicht, ohne etwas zu tun, das sich gegen den Strich anfühlte.
Ich denke, wenn Sie eine Ansicht wünschen, die nicht die normale Größe hat, die das Fenster ausfüllt, sollten Sie dafür eine Unteransicht verwenden.
quelle
Ich bin auf ein ähnliches Szenario gestoßen, in dem ich einem Projekt beigetreten bin, das mit automatischem Layout initiiert wurde, aber ich musste mehrere Ansichten dynamisch anpassen. Folgendes hat bei mir funktioniert:
Lassen Sie KEINE Ansichten oder Komponenten im Interface Builder anlegen.
Fügen Sie Ihre Ansichten rein programmgesteuert hinzu, indem Sie mit alloc / init beginnen und ihre Frames entsprechend einstellen.
Getan.
quelle
Anstatt das automatische Layout zu deaktivieren, würde ich nur die neue Einschränkung mit dem Frame berechnen, den Sie ersetzen. Das scheint mir der richtige Weg zu sein. Wenn Sie Komponenten anpassen, die auf Einschränkungen beruhen, passen Sie sie entsprechend an.
Wenn Sie beispielsweise eine vertikale Einschränkung von 0 zwischen zwei Ansichten (myView und otherView) haben und eine Schwenkgeste oder etwas haben, das die Höhe von myView anpasst, können Sie die Einschränkung mit den angepassten Werten neu berechnen.
quelle
Für diejenigen unter Ihnen, die das automatische Layout verwenden, sehen Sie sich bitte meine Lösung hier an . Sie sollten
@IBOutlet
die Einschränkungen festlegen, die Sie anpassen möchten, und dann deren Konstanten ändern.quelle
Wenn es sich um eine XIB-Datei handelt:
quelle