2017-05-31 5 views
0

Ich versuche, die Breite eines UITextField basierend auf der zunehmenden Breite eines anderen zu ändern. Hier ist ein Beispiel für mein Layout:Schrumpfbreite von UITextField basierend auf dem Wachstum eines anderen

Layout with two text fields

Auf der linken Feld (die int Dialogcodes einmal enthält, ausgewählt) Ich möchte diese 0 bis Spielraum einzustellen, mit zu beginnen und das Recht UITextField direkt gegenüber erstrecken. Wenn das linke Feld Daten enthält, möchte ich den Rand des rechten Textfelds relativ dazu anpassen.

Ich weiß, wie man das leicht in Android, aber ich habe nicht viel Glück in Xcode. Kann mir jemand in die richtige Richtung zeigen?

+0

Verwenden Sie automatisches Layout? –

+0

Ja - auf der linken Seite UILabel. Aber ich möchte mit der Breite der rechten UITextField-Box festlegen, aber verkleinern, wenn die UILabel auf der linken Seite wächst –

Antwort

1

Die Grundidee ist

  1. der Text geändert beobachten Ereignis
  2. neu berechnen die Breite
  3. Aktualisierung der constant Eigenschaft der Breite Einschränkung

Hier ist eine einfache Demo und mehr Kanten Fälle müssen berücksichtigt werden.

demo

- (void)viewDidLoad { 
    UIView *container = [[UIView alloc] initWithFrame:CGRectMake(100, 150, 175, 100)]; 
    container.backgroundColor = [UIColor grayColor]; 
    [self.view addSubview:container]; 

    //initialize text fields 
    UITextField *leftInput = [[UITextField alloc] initWithFrame:CGRectZero]; 
    leftInput.translatesAutoresizingMaskIntoConstraints = NO; 
    [leftInput addTarget:self action:@selector(textDidChange:) forControlEvents:UIControlEventEditingChanged]; 
    [container addSubview:leftInput]; 

    UITextField *rightInput = [[UITextField alloc] initWithFrame:CGRectZero]; 
    rightInput.translatesAutoresizingMaskIntoConstraints = NO; 
    [container addSubview:rightInput]; 

    //setup constraints 
    NSDictionary *views = NSDictionaryOfVariableBindings(container, leftInput, rightInput); 
    NSMutableArray *constraints = [NSMutableArray array]; 
    [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[leftInput]-[rightInput]-|" options:0 metrics:nil views:views]]; 
    [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[leftInput]-|" options:0 metrics:nil views:views]]; 
    [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[rightInput]-|" options:0 metrics:nil views:views]]; 
    NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:leftInput attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:0 constant:minWidth]; 
    [constraints addObject:widthConstraint]; 
    self.widthConstraint = widthConstraint; 
    [NSLayoutConstraint activateConstraints:constraints]; 
} 

- (void)textDidChange:(UITextField *)textInput { 
    NSDictionary *attributes = @{NSFontAttributeName: textInput.font}; 
    CGFloat width = [textInput.text sizeWithAttributes:attributes].width; 
    self.widthConstraint.constant = MAX(minWidth, width); 
} 
0

Hier ist eine Alternative ohne Konstanten zu verwenden. Die Idee besteht darin, das automatische Layout so einzurichten, dass es die Breite des linken Textfelds für Sie neu berechnet, sodass Sie das Layout einfach aktualisieren, wenn sich der Text ändert.

Zuerst legen Sie die Umgehungspriorität im linken Textfeld so fest, dass sie höher ist als im rechten Textfeld. Vergewissern Sie sich, diese horizontalen Einschränkungen installiert:

  1. Linker Rand des linken Textfeld Behälter (oder ein anderes Element, einfach fixieren den linken Rand)
  2. Rechter Rand des linken Textfeld sollte einen festen horizontalen Abstand haben linker Rand des rechten Textfelds (das ist die Lücke zwischen den Textfeldern, Standard ist 8px, aber verwenden Sie natürlich, was Sie wollen)
  3. Rechter Rand des rechten Textfelds auf der rechten Seite des Containers oder was auch immer Sie verwenden, um die zu verankern rechte Seite zu

Diese Kräfte Die zwei Textfelder, die einen bestimmten Abstand zwischen den linken und rechten Rändern einnehmen sollen, und das automatische Layout müssen entscheiden, welches Textfeld Vorrang erhält. Wenn Sie für linkes Textfeld die Umgehungspriorität höher setzen, geben Sie an, dass Sie das rechte Textfeld bevorzugen, um zu erweitern, wenn Platz verfügbar ist. Wenn also beide Felder leer sind, nimmt das rechte das gesamte Feld ein. Deshalb müssen Sie Constraints größer als oder kleiner als Constraints festlegen, um zu begrenzen, wie klein/groß Ihre Textfelder werden können.

Nehmen wir an, wir beginnen mit beiden leeren Textfeldern. An dieser Stelle wäre es schlau, für das linke Textfeld eine Mindestbreite anzugeben, da es ansonsten eine Breite von 0 hat und somit kein Text eingegeben werden kann. Eine Mindestgröße von etwa 50 sollte für eine Texteingabe angemessen sein, aber versuchen Sie zu sehen, was für Sie funktioniert.

Denken Sie daran, die Textbearbeitung geändert Eigenschaft auf dem Textfeld zu erfassen, so dass Sie das Textfeld leftTextField, rufen

[leftTextField addTarget:self action:@selector(leftTextChanged) forControlEvents:UIControlEventEditingChanged]; 

irgendwo Methode in Ihrem viewDidLoad oder anderer Initialisierung genannt in einer Variable angenommen wird.

Jetzt ist alles, was übrig bleibt, um Autolayout zu bitten, die innere Größe der Ansichten neu zu berechnen und sich selbst zu aktualisieren. Dies geschieht durch Aufruf layoutIfNeeded getan, so dass Ihre Methode wie

- (void)leftTextChanged { 
    [self.view layoutIfNeeded]; 
} 

Hoffnung aussehen würde, das hilft.

Verwandte Themen