Erhalten Sie Rahmen in einer Ansicht nach dem autolayout
Habe ich eine Methode:
- (void)underlineTextField:(UITextField *)tf {
CGFloat x = tf.frame.origin.x-8;
CGFloat y = tf.origin.y+tf.frame.size.height+1;
CGFloat width = self.inputView.frame.size.width-16;
UIView *line = [[UIView alloc] initWithFrame:(CGRect){x,y,width,1}];
line.backgroundColor = [UIColor whiteColor];
[self.inputView addSubview:line];
}
Unterstreicht, dass eine Eingabe UITextField
; textfield hat eine Breite, die ändert sich je nach Bildschirmbreite (nib autolayout).
Habe ich versucht, mit
[self.view setNeedsLayout];
[self.view layoutIfNeeded];
und
[self.inputView setNeedsLayout];
[self.inputView layoutIfNeeded];
bevor ich diese Methode aufrufen, die keine änderung im Ergebnis. die resultierende Linie ist deutlich breiter als das UITextField (es entspricht der ursprünglichen Größe in die Feder).
Ich will nur das daraus resultierende Bild der UITextField in der Frage nach der Verarbeitung durch das autolayout
LÖSUNG: (mit der 'Mauerwerk' Autolayout)
- (UIView *)underlineTextField:(UITextField *)tf {
UIView *line = [[UIView alloc] initWithFrame:CGRectZero];
line.backgroundColor = [UIColor whiteColor];
[self.inputView addSubview:line];
[line mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(tf.mas_centerX);
make.width.equalTo(tf.mas_width).with.offset(16);
make.height.equalTo(@1);
make.top.equalTo(tf.mas_bottom);
}];
return line;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre unterstreichen
view
hat ein statisches Bild, es ist nicht an dertextField
durch Zwänge. Stattdessen setzen den Rahmen, fügen Sie Einschränkungen zuself.inputView
Nach der
layoutIfNeeded
nennen, den Rahmen für Ihre Ansicht sollte Recht behalten. Ich hoffe, ich habe die Konstanten rechts. Weil die Zeile eine Einheit unter den textView stellen Sie sicher, dass unsetClip Subviews
im storyboard für dastextField
Ich hoffe, das funktioniert für Sie. Lassen Sie mich wissen, wenn Sie Fragen haben!
Könnten Sie passen die Rahmen die Unterstreichung in
viewDidLayoutSubviews
die aufgerufen wird, nachdem "auto-layout" gesetzt hat, alle frames.Beachten Sie, dass Sie erstellen eine neue Ansicht und aufrufen
addSubview:
jeder Zeit. Sollten Sie tun, wenn Sie Sie erstellen, die text anzeigen, außerhalb dieser Methode. Andernfalls erstellen Sie einen neuenUIView
jedes mal, wenn der Benutzer das Gerät dreht.viewDidLayoutSubviews
genannt wird, etwa 20-mal am laden, ich will nur dieses einmal ausgeführt. gibt es einen Grund, warum -setNeedsLayout nicht funktioniert?setNeedsLayout
nicht tun. Sie wollen es nicht einmal ausgeführt. Sie aktualisieren den Rahmen jedes malinputView
's frame-Veränderungen.