2016-05-13 12 views
1

Ich habe in meiner App eine UITextField auf der linken Seite und eine UIButton auf der rechten Seite. Das Textfeld ist links im Superview (eine Containeransicht) und rechts neben der Schaltfläche verankert. So in der linken Seite Textfeld gibt es eineniOS: Aktualisieren von Einschränkungen und Rahmen zur gleichen Zeit

führenden Raum = 0 im Verhältnis von Behälter

und auf dem rechten Seite ein

Leerzeichen am Ende = 0 in Beziehung Taste

aber wenn ich die Schaltfläche auf die richtige Weise verschieben, ändern Sie den x-Ursprung Wert, warum das Textfeld nicht vergrößern seine Breite?

(offensichtlich der Knopf hat seine Einschränkungen über Breite und Höhe und für die Position, nicht aber, dass das Textfeld sperrt)

so, wenn ich dies

self.mybutton.frame = CGRectMake(self.mybutton.frame.origin.x+100, self.mybutton.frame.origin.y, self.mybutton.frame.size.width, self.mybutton.frame.size.height); 

die Taste in der richtigen Richtung bewegt tun, aber das Textfeld scheint seine Breite nicht zu vergrößern. Wissen Sie warum?

+0

Do it die Anders herum geben Sie Textfeld eine Breitenbeschränkung und ändern Sie es programmatisch –

Antwort

0

Könnten Sie versuchen, die Hinter Einschränkung der Schaltfläche Animieren?

Wie so (ich änderte die Einschränkung innerhalb eines Animationsblock zu Veranschaulichungszwecken):

UIView.animateWithDuration(
    5.0, 
    animations: { 
     self.buttonTrailingMarginConstraint.constant = 0 
     self.view.layoutIfNeeded() // Necessary when changing constraints. 
    } 
) 

Endergebnis:

Example

Git-Klon-Projekt: https://github.com/backslash-f/animating-constraints

2

Die Arbeit mit Auto Layout und programmatischer Positionierung/Größenanpassung kann viele Kopfschmerzen verursachen. Ein Teil davon ist, dass Sie Einschränkungen in Auto Layout erstellt haben, die im Grunde "Regeln" sind, denen Ihre App beim Verlegen aller Ansichten folgen muss, und wenn Sie die Rahmen-, Rahmen- oder Mittelpunkteigenschaften ändern, können Sie diese Regeln ungültig machen . Da jedoch das automatische Layout das Layout Ihrer Ansichten nicht ständig neu berechnet, bleiben Probleme möglicherweise unbemerkt, bis eine Neuberechnung des Layouts ausgelöst wird.

Um Ihre Frage zu beantworten, ändern Sie den Rahmen der Schaltfläche nicht den Text ändern, da Auto Layout keine Ahnung hat, dass sich etwas geändert hat. Außerdem haben Sie die Einschränkungen für die Schaltfläche nicht geändert. Wenn Sie also in Ihrem Textfeld und auf der Schaltfläche - (void) setNeedsUpdateConstraints aufgerufen haben, wird die gesuchte Änderung nicht passieren. Die Schaltfläche wird in die ursprüngliche Position zurückgesetzt, die Sie mit Einschränkungen festgelegt haben.

Was Sie wollen, ist ein IBOutlet auf was auch immer erstellt wird, wie die Schaltfläche auf der x-Achse positioniert wird (d. H. Seine nachstehende Leerzeichen ... wenn Sie das verwenden). Dann anstatt das zu tun:

self.mybutton.frame = CGRectMake(self.mybutton.frame.origin.x+100, self.mybutton.frame.origin.y, self.mybutton.frame.size.width, self.mybutton.frame.size.height); 

Sie könnten so etwas wie:

self.mybuttonXconstraint.constant = self.mybuttonXconstraint.constant + 100 
[self.parentView setNeedsUpdateConstraints] 

Die zweite Zeile ist, um sicherzustellen, dass Auto-Layout kennt eine Einschränkung geändert wurde und dass sie das Layout für alle Ansichten neu berechnen mit den Einschränkungen der Eltern beteiligt.

auch für Sie von Interesse sein Dies kann - iOS Developer Library - Auto Layout Guide