Einschränkungen programmgesteuert festlegen
Bin ich zu Experimentieren mit der Verwendung UIScrollView. Nach viel Mühe habe ich endlich den Dreh raus. Aber jetzt habe ich scheinen zu schlagen einen anderen Haken.
In diesem einfachen app, ich habe eine scroll-view mit und um für ihn zu arbeiten, habe ich die Ansicht Boden Platz zu scrollview Einschränkung 0 wie beschrieben hier und es funktioniert gut. Ich mache es über die IB.
Nun habe ich über ein Szenario, in dem ich zu tun haben, dass ein Teil programmgesteuert. Ich habe den untenstehenden code in die viewDidLoad
Methode.
NSLayoutConstraint *bottomSpaceConstraint = [NSLayoutConstraint constraintWithItem:self.view
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.scrollView
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:0.0];
[self.view addConstraint:bottomSpaceConstraint];
Aber es scheint nicht zu funktionieren. Es gibt die folgende Meldung in der Konsole-Fenster und ich weiß nicht was ich davon halten soll.
Nicht in der Lage, gleichzeitig zu befriedigen Einschränkungen.
Wahrscheinlich mindestens eine der Einschränkungen in der folgenden Liste ist eine, die Sie nicht wollen. Versuchen Sie dies: (1) betrachten Sie jedes Hindernis und versuchen Sie herauszufinden, die Sie nicht erwartet; (2) finden Sie den code, der Hinzugefügt die unerwünschte Einschränkung oder Einschränkungen, und es zu beheben. (Hinweis: Wenn Sie sehen, NSAutoresizingMaskLayoutConstraints, dass Sie nicht verstehen, finden Sie in der Dokumentation für die UIView-Eigenschaft translatesAutoresizingMaskIntoConstraints)
(
"",
""
)
Kann mir bitte jemand sagen, wie dies zu tun? Ich habe auch schonmal ein demo-Projekt hier, so dass Sie können erhalten eine bessere Vorstellung über das Thema.
UPDATE:
Erste aus Dank für die Antworten. Mit der erwähnten Arten in den Antworten war ich in der Lage, um es arbeiten. Aber ina etwas anderes Szenario nicht. Jetzt bin ich versucht, zu laden, eine Sicht auf einen viewcontroller programmatisch.
Wenn ich kann, erklären. Es gibt 2 view-Controller. Ersten wird eine UITableViewController
und der zweite UIViewController
. Im inneren, ein UIScrollView
. Auch gibt Es mehrere UIView
s und einige dieser Ansichten' Höhe, überschreitet die normale Höhe des Bildschirms.
Den UITableViewController
zeigt eine Liste von Optionen. Basierend auf der Auswahl des Benutzers, einen bestimmten UIView
aus der Menge wird geladen und in die UIViewController
mit der UIScrollView
.
In diesem Szenario die oben genannten Methode nicht funktioniert. Das scrollen ist nicht passiert. Muss ich etwas anders machen, da ich das laden der Ansicht getrennt?
Ich habe hochgeladen ein demo-Projekt hier, so dass Sie sehen es in Aktion. Finden Sie die Email.xib
und wählen Sie E-Mail aus der Tabelle Liste anzeigen.
InformationsquelleAutor der Frage Isuru | 2013-04-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basierend auf einem review von code, ein paar Kommentare:
Sie in der Regel brauchen Sie nicht zu justieren Einschränkungen, wenn eine Ansicht eingeblendet wird. Wenn Sie sich finden, dies zu tun, ist es oft bedeutet, dass Sie noch nicht konfiguriert Ihr storyboard richtig (oder zumindest nicht effizient). Die einzige Zeit, die Sie wirklich brauchen, um set/create constraints ist entweder (a) du bist hinzufügen von views programmatisch (was ich Vorschlage, ist mehr Arbeit als es Wert ist); oder (b) Sie tun müssen, einige Laufzeit-Anpassung mit Einschränkungen (siehe Dritte Kugel, die unter Punkt 3, unten).
Ich will damit nicht herumreiten, aber dein Projekt hatte eine Reihe von redundanten code. E. g.
Waren Sie die Einstellung der Rahmen für die Bildlaufleiste anzeigen, aber das unterliegt Einschränkungen, so dass nichts tut (d.h. wenn die Zwangsbedingungen, die alle manuell gesetzt
frame
Einstellungen ersetzt werden). Im Allgemeinen, In der auto-layout, versuchen Sie nicht ändernframe
direkt: Bearbeiten Sie die Einschränkungen. Aber, keine änderung der Randbedingungen ist notwendig, überhaupt, sowieso, der Punkt ist also irrelevant.Waren Sie die Einstellung der Größe des Inhalts für die Blättern-Ansicht, sondern in "auto-layout", auch das ist geregelt durch Einschränkungen (Untersichten), so daß es unnötig war.
Waren Sie die Einstellung Einschränkungen für die scrollview (die bereits zu null), aber dann waren Sie nicht hinzufügen die Aussicht von der Spitze in die scrollview, besiegen Absicht auch dort. Die ursprüngliche Frage war, wie das ändern der unteren Einschränkung des scroll-Ansicht. Aber die untere Beschränkung, denn das ist bereits null, so sehe ich keinen Grund, um es wieder auf null.
Ich würde vorschlagen, eine weitere Radikale Vereinfachung Ihres Projekts:
Machst dir das Leben viel schwieriger, auf sich selbst, indem Sie Ihre Ansichten in die Federn. Es ist viel einfacher, wenn man sich innerhalb der storyboard-Welt. Wir helfen Ihnen, NIB Zeug, wenn Sie wirklich müssen, aber warum das Leben so hart zu dir selbst?
Verwenden Sie cell-Prototypen zu erleichtern, das design der Zellen in Ihrer Tabelle. Sie können auch festlegen, leitet über zu gehen von den Zellen zu der nächsten Szene. Dieses beseitigt jede mögliche Notwendigkeit zu schreiben
didSelectRowAtIndexPath
oderprepareForSegue
code. Klar, wenn Sie etwas, das Sie brauchen, um passieren, um die nächste Szene, mit allen Mitteln verwenden SieprepareForSegue
, aber nichts, was Sie präsentiert haben, so weit verlangt, also habe ich kommentiert es in meinen Beispielen.Vorausgesetzt, Sie waren auf der Suche ein praktisches Beispiel für die programmgesteuerte änderung der Einschränkungen, ich habe die Szene so, dass die text-Ansicht ändert sich die Höhe programmgesteuert, basierend auf dem text in der text-Ansicht. Wie immer, anstatt das Durchlaufen der Zwänge zu finden, der in Frage, wenn die änderung einer bestehenden Einschränkung, dass IB für mich geschaffen, ich denke, es ist wesentlich effizienter einrichten einer
IBOutlet
für die Einschränkung, und Bearbeiten Sie dieconstant
Eigenschaft für die Einschränkung direkt, so dass ' s was ich getan habe. Also habe ich den view-controller der Delegat, der die text-Ansicht, und schrieb einetextViewDidChange
dass aktualisiert die text-Ansicht ist die Höhe, die Einschränkung:Beachten Sie, dass meine text-Ansicht hat zwei Höhe-Einschränkungen, eine zwingende Mindesthöhe Einschränkung, und eine mittlere Priorität Einschränkung, die ich ändern oben basierend auf dem Menge text. Der wichtigste Punkt ist, dass es illustriert ein praktisches Beispiel für wechselnde Randbedingungen programmgesteuert. Sie sollten nicht, um dreck, um mit der scrollview die untere Beschränkung, aber das ist, zeigt ein reales Beispiel, wenn Sie einstellen möchten, der eine Einschränkung.
Wenn Sie hinzufügen, eine scrollview in IB, wird es automatisch alle die Einschränkungen, die Sie benötigen. Sie wollen wahrscheinlich nicht zu sein indem eine Einschränkung programmgesteuert (zumindest nicht ohne entfernen der vorhandenen Boden-Einschränkung).
Beiden Ansätze könnte einfacher sein:
Erstellen Sie eine
IBOutlet
für Ihren vorhandenen Boden-Einschränkung, sagenscrollViewBottomConstraint
. Dann können Sie nurOder erstellen Sie Ihre anzeigen zunächst in IB, wo die untere Beschränkung ist 0,0 und dann müssen Sie nicht haben, etwas zu tun programmgesteuert auf alle. Wenn Sie wollen, um das layout einer langen scrollview und es ist Untersichten, wählen Sie den controller, set simulierte Kenngrößen aus den "inferred" , "free form". Dann können Sie ändern Sie die Größe der Ansicht der scrollview die oberen und unteren Randbedingungen zu null werden, das layout alles, was Sie wollen, innerhalb der scroll-view, und dann, wenn die view dargestellt wird, zur Laufzeit, wird die Ansicht vergrößert bzw. verkleinert werden angemessen, und weil Sie definiert haben, der scrollview ist oben und unten constraints 0.0, it will be resized richtig. Es sieht ein bisschen seltsam in IB, aber es funktioniert wie ein Charme, wenn die app ausgeführt wird.
Wenn Sie entschlossen sind, hinzufügen, um eine neue Einschränkung, Sie können entweder programmgesteuert entfernen der alten Boden-Einschränkung, oder die alten Beschränkungen für den unteren Rand' Priorität nach unten so gering wie möglich, und auf diese Weise Ihre neue Einschränkung (mit höherer Priorität) Vorrang, und die alte, niedrige Priorität untere Beschränkung wird nicht ordnungsgemäß angewendet werden.
Aber Sie definitiv nicht wollen, fügen Sie einfach eine neue Einschränkung.
InformationsquelleAutor der Antwort Rob
Es ist möglich zu erstellen outlets vertreten layout constraints im view controller. Wählen Sie einfach die Einschränkung, die Sie wünschen und im interface-builder (z.B. via "auswählen und Bearbeiten" auf die Messungen der Bereich von der Ansicht, die Vermittlung). Dann gehen Sie zu den Ausgängen Bereich und ziehen Sie ein "New Referencing Outlet" auf Ihrer code-Datei (.h oder .m). Diese binden die Einschränkung auf eine
NSLayoutConstraint
Instanz, auf die Sie Zugriff von Ihrem controller und passen Sie dynamisch on-the-fly (in der Regel über dieconstant
Eigenschaft, die ist schlecht genannt, weil es keine Konstante ist).(Beachten Sie, dass in XCode 6 Sie können doppelklicken Sie auf die Einschränkung, wählen Sie es zum Bearbeiten.)
Vorsichtig sein beim einstellen des layout im interface builder, aber Sie können am Ende das löschen der Einschränkung und neu binden Sie es an der Steckdose.
InformationsquelleAutor der Antwort devios1
Blick auf die Konsole, habe ich das Gefühl, das Sie erstellen Mehrdeutigkeit, wenn man zwei gleiche Art von Einschränkung.
Also anstelle von erstellen und hinzufügen von neuen Einschränkung, versuchen, die Aktualisierung der vorherigen Einschränkung, die bereits in den Einschränkungen array.
Hoffe, das hilft
Sogar Rob ' s Antwort.
InformationsquelleAutor der Antwort Kunal
Können Sie https://github.com/SnapKit/Masonry für Einschränkungen hinzufügen, programmgesteuert.
Es ist die macht der AutoLayout NSLayoutConstraints mit einer vereinfachten, verkettbare und ausdrucksstarke syntax. Unterstützt iOS-und OSX-Auto-Layout".
in nur wenigen Zeilen
Hier die gleichen Einschränkungen erstellt mit MASConstraintMaker
Oder sogar kürzer
tun Sie Ihr bestes, ist so in der Art 😉
InformationsquelleAutor der Antwort ERbittuu