2017-10-13 11 views
0

Ich habe eine imageView innerhalb einer ovalView mit Auto-Layout eingeschränkt.Falsche Frame-Position, wenn in ViewDidLayoutSubviews definiert

Innen viewDidLayoutSubviews(), ich schaffe eine UILabel

let label = UILabel(frame: imageView.frame) 
imageView.superview?.addSubview(label) 

Der Rahmen des Etiketts zeigt etwas von Imageview off-zentriert.

Allerdings, wenn ich meinen obigen Code innerhalb viewDidAppear() verschiebe, ist Label perfekt auf imageView zentriert, aber Benutzer sieht die Änderung, die unerwünscht ist.

Wie behalte ich meinen Code in viewDidLayoutSubviews() und es funktioniert?

+0

Sie bewusst sind, dass der Rahmen Einstellung der Ursprung ändert, oben links Anker Ansicht zu sein? Das heißt, Sie müssten die Hälfte der Etikettenbreite subtrahieren, um sie auf der x-Achse zu zentrieren. – LinusGeffarth

+0

Warum funktioniert es in ViewDidAppear dann? – Kashif

Antwort

0

Für andere, die möglicherweise mit ähnlichen Problemen konfrontiert sind. Ich konnte meinen Code in viewDidLayoutSubviews() halten von

self.view.layoutIfNeeded() 

in meinem Code hinzufügen nach

let label = UILabel(frame: imageView.frame) 
imageView.superview?.addSubview(label) 
1

Wenn viewDidLayoutSubviews aufgerufen wird, können Sie nicht davon ausgehen, dass Ihre Ansichten ihre letzten Frames haben, bevor diese Methode aufgerufen wird. In deinem Fall ist das passiert. Wenn Sie viewDidAppear anrufen, hat Ihre Ansicht alle ihre Frames gezeichnet und Sie erhalten den richtigen Frame, deshalb funktioniert es für Sie. Rufen Sie es stattdessen in viewDidAppear an.

+0

Oder in 'viewDidLoad' oder' viewWillAppear', wenn der Benutzer die Änderung nicht sehen soll. – LinusGeffarth

+0

@LinusGeffarth, tatsächlich. Aber ich hätte es in "viewWillappear" hinzugefügt. –

+0

Es funktioniert nicht in ViewDidLoad oder viewWillAppear. Es funktioniert nur in viewDidAppear und der Benutzer kann die Änderungen sehen (unerwünscht). – Kashif

Verwandte Themen