webentwicklung-frage-antwort-db.com.de

So erzwingen Sie layoutSubviews von UIView.

Ich habe ein benutzerdefiniertes UIView mit einem dedizierten, manuell festgelegten Rahmen für die Ausrichtung im Hoch- und Querformat, da die automatische Größenänderung von Masken in meinem Fall einfach nicht funktioniert.

Ich setze diesen Rahmen in:

 - (void)viewWillAppear:(BOOL)animated

Und es funktioniert wie erwartet.

Mein Problem ist nun, dass mein UIView außerdem Unteransichten hat, die auch eine eigene Position für Hoch-/Querformat haben.

Ich positioniere diese Subviews in:

- (void)layoutSubviews

Wenn ich jetzt meinen viewController in zB Hochformat lasse, auf einem anderen viewController in Querformat drehe und dann zu diesem viewController zurückkehre, sehe ich, dass die Größe meiner Ansicht korrekt geändert wurde, aber die Unteransichten meiner Ansicht, die positioniert werden in layoutSubviews sind noch nicht neu positioniert, ihre Größe wird jedoch animiert geändert, nachdem die Ansicht bereits angezeigt wurde.

Ich tue nichts in viewDidAppear und habe bereits versucht anzurufen

 - (void)layoutIfNeeded

Ebenso gut wie:

 - (void)setNeedsLayout

In viewWillAppear scheint es aber nichts zu ändern.

Irgendwelche Ideen, was ich falsch mache?

Vielen Dank.

50
myell0w

Hatte heute ein ähnliches Problem. Ich habe es gelöst, indem ich zuerst angerufen habe

  • -setNeedsLayout: Setzen Sie das Flag, dass die Ansicht Layout benötigt, und rufen Sie danach auf
  • -layoutIfNeeded: Markieren Sie sofort und - wie zuvor manuell gesetzt - als Ergebnis, dass layoutSubviews aufgerufen wird.

Ich weiß nicht, ob das der beste Weg ist, aber es funktioniert;)

92
blacky85

Ich würde vorschlagen, den anfänglichen Rahmen in viewDidLoad zu setzen und dann den Ansichtsrahmen zu ändern, um die Ausrichtung in zu ändern

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

Sie benötigen keine expliziten Animationen in layoutSubviews (nicht sicher, ob Sie welche hatten, aber es klang so), da alle Frame-Änderungen mit der Rotationsanimation synchronisiert werden.

Wenn Sie sich außerhalb des Bildschirms befinden, sollte die Ausrichtung immer noch gedreht sein, damit Ihre Ansichten korrekt positioniert sind, wenn Sie wieder auf den Bildschirm wechseln.

Ich empfehle außerdem, die WWDC 2010-Sitzung 123 "Building Animation Driven UI" anzusehen, in der dieses Thema ausführlicher behandelt wird.

5
Chris Miles

Um Swift 3 @iOS 10.1

override func viewWillAppear(animated: Bool){

    super.viewWillAppear(animated)
    view.setNeedsLayout()
}

läuft perfekt