2016-08-08 24 views
0

Ich füge eine Ansicht programmatisch hinzu und verändere die Konstante der Höhenbeschränkung, aber sie stellt die Breite nicht als Bildschirmbreite in der viewDidLoad-Methode ein. Aber die Breite ist perfekt eingestellt, wenn diese Zeile nach einer Verzögerung von 0,2 Sekunden eingefügt wird.Warum muss ich nach einer gewissen Verzögerung die Constraint-Konstante setzen?

Unten ist mein Code

hinzugefügt In ViewDidLoad

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ cAreaView = [[[NSBundle mainBundle] loadNibNamed:@"aView" owner:nil options:nil] objectAtIndex:0]; [_vwComplaintArea addSubview:cAreaView]; [self setConstraintLayout:cAreaView toVw:_vwComplaintArea]; [_firstViewHeightConstraint setConstant:_firstViewHeightConstraint.constant + cAreaView.bounds.size.height]; [_heightForComplaintARe setConstant:cAreaView.bounds.size.height]; });

-(void)setConstraintLayout:(UIView *)vw toVw:(UIView *)toVw { [vw autoSetDimensionsToSize:CGSizeMake(toVw.bounds.size.width, vw.bounds.size.height)]; [vw autoPinEdge:ALEdgeTop toEdge:ALEdgeTop ofView:toVw]; [vw autoPinEdge:ALEdgeLeft toEdge:ALEdgeLeft ofView:toVw]; }

Kann jemand, der beste Weg vorschlagen Einschränkungen in viewDidLoad programmatisch zu setzen.

Danke.

+0

Try Einschränkung in viewWillAppear einzustellen. – Catoshi

+0

Aber es zeigt eine Animation der sich ändernden Höhe von View. Ich will dort keine Animation. –

+0

Können Sie Ihren Code eingeben, der nicht funktioniert und funktioniert? –

Antwort

0

Ich würde vorschlagen, Sie zu überschreiben viewWillLayoutSubviews und viewDidLayoutSubviews. In viewDidLoad sollten Sie nur Elemente zu Ihrer Ansicht von Xib hinzufügen, jede Manipulation für den Rahmen sollte in Ansicht werden und tat Layout-Untersichten. Es muss etwas mit dem Ansichtszyklus gemacht werden.

Pro Dokumentation: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instm/UIViewController/viewDidLayoutSubviews

Wenn die Grenzen Änderung für eine Ansicht des View-Controller, wobei die Ansicht der Positionen seiner Subviews einstellt und dann ruft das System diese Methode.

Bei diesem Ereignis haben Sie die korrekte Situation bezüglich des Bildschirms und der Entfernungen, sodass Sie Einschränkungen und Rahmen entsprechend aktualisieren können.

+0

negativ für was? Nicht richtig? – Miknash

+0

Ja. Er muss 'viewWill/DidLayoutSubviews' nicht überschreiben. Es würde benötigt, wenn er Frames statt Auto-Layout verwendet. –

+0

Ich versuche, eine Sicht in Unteransicht hinzuzufügen und Einschränkung hinzuzufügen. Kann ich dasselbe in der viewDidLayoutSubviews-Methode tun? @ Cy-4AH –

-1

Setzen Sie Ihre Einschränkungen nicht in viewDidLoad. Setzen Sie sie stattdessen in viewDidAppear oder viewDidLayoutSubviews. Damit Ihre App alle Komponenten zum Anwenden von Einschränkungen geladen hat.

1

Sie können die Constraint-Konstante jederzeit ändern. Aber wie ich verstanden habe, versuchen Sie, den viewviewviewview gleich frame oder bounds konstanten Wert gleich zu setzen. Sie müssen wissen, dass in viewDidLoad diese Eigenschaften keine tatsächlichen Werte haben, da Sie Autolayout verwenden; Sie erhalten tatsächliche Werte in viewDidLayoutSubviews Methode (beachten Sie, dass es mehrmals aufgerufen werden kann). Wenn Sie eine Verzögerung von 0,2 Sekunden hinzufügen, sind die automatischen Layout-Prozesse bereits abgeschlossen, weshalb Sie das richtige Ergebnis erhalten. So können Sie Constraint Konstante in viewDidLayoutSubviews zuweisen, oder besser gerade neue Einschränkung für gleiche Breite hinzu:

let someProportion: CGFloat = 2 
view.addConstraint(NSLayoutConstraint(item: yourView, attribute: .Width, relatedBy: .Equal, toItem: view, attribute: .Width, multiplier: someProportion, constant: 0)) 
+0

wird es Constartin viele Male in viewDidLayoutSubviews ?? –

+0

@ManishPatel sollten Sie sich darum kümmern. Sie sollten in viewDidLayoutSubviews absolut keine neuen Constraints erstellen, Sie dürfen nur Konstanten für existierende (zB in viewDidLoad) Constraints ändern. Sie müssen Code zur Verfügung stellen, der flexibel ist und nicht von vorherigem konstantem Wert abhängt. –

+0

@ManishPatel aber wie gesagt, da Sie das automatische Layout verwenden, sollten Sie Ihre Größenlogik besser überdenken und neue Gleichheitsbeschränkungen machen, ohne Manipulation mit Frames/Grenzen. –