2014-04-07 9 views
5

In einem UIToolbar in Landschaft zu füllen, hat ich ein UITextField in die Mitte der Stange hinzugefügt mit einer anderen UIBarButtonItem (Aktionstaste) daneben (die als UIBarButtonItem hinzugefügt werden). Ich fügte flexible Leertaste Button-Elemente ganz links und ganz rechts hinzu. Im Hochformat sieht es gut aus, aber wenn ich es in die Landschaft drehe, zentriert es es und sieht ok aus, aber ich brauche das Textfeld, um die Breite zu füllen und den letzten Knopf nach rechts zu drücken - genau wie in Nachrichten - an iPhone und iPad.anpassen Breite UITextField Symbolleiste

Ich dachte Auto-Layout würde den Trick tun, aber Apple besagt, dass Sie keine Einschränkungen für UIBarButtonItem s erstellen können. Und in der Tat, wenn ich eine der Balken-Schaltflächen oder das Textfeld auswähle, kann ich keine Einschränkungen erstellen.

Könnten Sie bitte lassen Sie mich wissen, wie dies zu erreichen? Vielen Dank!

enter image description here

EDIT: Ich habe mit festen/flexiblen Räumen ein paar andere Kombinationen ausprobiert. Wenn ich nicht hinzufügen, jeder, das Textfeld und Share-Taste nach links geschoben:
enter image description here

Wenn ich stattdessen festen Räumen zu tun, ist es genau die gleiche wie oben mit 0 Breiten sieht, oder wenn ich gesetzt eine Breite, dann wird es sie offensichtlich drängen. Das letzte Feld ganz rechts hat keinen Effekt - es ist nicht gegen die äußerste rechte Seite fixiert, so dass es vom Bildschirm verschwindet.

Ich versuchte einen festen Platz auf der linken Seite und einen flexiblen auf der rechten Seite, mit der mittleren festen (oder keine mittlere), und es sieht aus wie der Screenshot oben. Ich änderte dann die mittlere flexible und es stellte sich heraus, wie folgt aus:
enter image description here

Wenn ich die erste flexible, keine in der Mitte ändern (oder wenn ich eine feste man hinzufügen), und auf der rechten Seite flxed, es wird nach rechts bewegt über:
enter image description here

Wenn die erste flexibel ist, in der Mitte flexibel ist und richtig befestigt ist, das ist, wie es aussieht:
enter image description here

In allen Fällen die Breite der Textfeld bleibt der gleiche statische Wert e wie es ursprünglich im Storyboard eingerichtet wurde. Ich denke, das Problem ist, dass, wenn Sie die Breite durch Ziehen des Rahmens einstellen, keine blauen Richtlinien zum Einrasten vorhanden sind, so dass sie immer dieselbe Breite beibehalten.

Habe ich eine Kombination von Räumen vermisst? Wenn ich das gewünschte Verhalten im Interface Builder nicht implementieren kann, wie würde man dies im Code erreichen?

Antwort

9

ein horizontal Strecken Textfeld zu erhalten, musste ich eingestellt seine Hand frame in viewWillAppear zu und auch, wenn die Orientierungsänderungen - gebraucht I viewWillTransitionToSize:withTransitionCoordinator::

[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> __nonnull context) { 
    self.textField.frame = CGRectMake(0, 0, self.navigationController.navigationBar.frame.size.width - self.actionButton.width - 55, self.inputTextField.frame.size.height); 
} completion:^(id<UIViewControllerTransitionCoordinatorContext> __nonnull context) { 
}]; 


Vorherige Lösung (funktioniert nicht mehr für mich in neueste OSes):

Fügen Sie diese in viewDidLoad:

self.textField.autoresizingMask = UIViewAutoresizingFlexibleWidth; 

enter image description here

+0

Ist für mich nicht 6.2/iOS8 in Xcode arbeiten: die UITextField bleibt eine feste Größe, so wird die Symbolleiste in der kompakten Größe abgehackt und es ist nicht breit genug, um in der regulären Größe. – 7stud

+0

Ich fand heraus, warum es für mich nicht funktionierte: Ich habe mir die Ergebnisse in Preview angeschaut, wo du gleichzeitig ein iPhone und ein iPad sehen kannst, siehe hier (ignoriere die Tatsache, dass Swift sagt: Das Tutorial hat nichts mit Swift zu tun: https://www.youtube.com/watch?v=p5wD8dvSDbM. Anscheinend zeigt Ihnen Preview nur, was Sie in IB getan haben, daher kann Preview den Code in der Antwort nicht sehen. In der Vorschau lief mein TextField also nicht, aber als ich meinen Code run (Run'ed ?!) gegen verschiedene Geräte liefere (klicke auf das Gerät in der Sprungleiste rechts neben der Stop-Taste, und wähle ein anderes Gerät aus), ... – 7stud

+0

... die Größe des TextFields an den verfügbaren Platz angepasst wurde. Vielen Dank! – 7stud