2016-06-20 7 views
1

Ich ändere einige Einschränkungen und versteckt einige Elemente auf einer bestimmten VC abhängig davon, welches Gerät der Benutzer verwendet.Soll ich layoutIfNeeded in viewDidLayoutSubviews() aufrufen

So:

override func viewDidLayoutSubviews() { 
     if Iphone6 == true { 
      self.view.layoutIfNeeded() 
      self.someConst.constant = 70 
      self.anotherConst.constant = 67 
      self.someButton.hidden = true 
      self.someView.hidden = true 
      self.view.layoutIfNeeded() 
     } 
    } 

Jetzt frage ich mich, ob ich layoutIfNeeded() zweimal in viewDidLayoutSubviews anrufen müssen?

Ich weiß, dass Sie layoutIfNeeded() zweimal aufrufen müssen, wenn Sie animateWithDuration verwenden, wenn Sie Einschränkungen ändern, aber dies gilt auch für viewDidLayoutSubviews?

Danke,

+0

würde ich Ihre 'if'statement in' viewdidload' statt 'viewDidLayoutSubviews' setzen. – SeNeO

+0

@SeNeO wie kommt es? Ich dachte, dass Sie Ihre Einschränkungen/Elemente in ViewDidLoad nicht ändern sollten – user2636197

Antwort

2

Der Zweck layoutIfNeeded() ist ein synchrones (im wesentlichen „immediate“) Neuzeichnen eine Ansicht und ihre Subviews zu erzwingen. Wenn es sich um Animationen handelt, hält es Apple für die beste Vorgehensweise, vor dem Animationsblock layoutIfNeeded() aufzurufen, um sicherzustellen, dass ausstehende Layoutvorgänge vollständig abgeschlossen sind. Dies bereitet die Ansichten für die Vorgänge vor, um ihre neuen Layouts zu bestimmen und festzulegen. layoutIfNeeded() wird dann ein zweites Mal innerhalb des Animationsblocks aufgerufen, um sicherzustellen, dass die animierten Änderungen am Layout ebenfalls abgeschlossen sind.

Apples Dokumentation für viewDidLayoutSubviews() drückt aus, dass diese aufgerufene Methode nicht angibt, dass die einzelnen Layouts der Unteransichten der Ansicht angepasst wurden. Wenn Sie also mit der Überprüfung des verwendeten Geräts beginnen und das Layout entsprechend anpassen, kann nicht garantiert werden, dass alle vorherigen Layoutoperationen erfolgreich abgeschlossen wurden. Aus diesem Grund ist es eine gute Idee für Sie, weiterhin layoutIfNeeded() zweimal anrufen. Einmal, um sicherzustellen, dass alle vorherigen Layout-Vorgänge abgeschlossen sind, und noch einmal, um die Layoutänderungen, die Sie basierend auf dem Gerätetyp vorgenommen haben, zu übernehmen.

Quellen:

How do I animate constraint changes?

setNeedsLayout vs layoutIfNeeded Explained

viewDidLayoutSubviews Reference

Verwandte Themen