2017-04-02 1 views
0

Ich habe eine UIStackView Build in Interface Builder zu entfernen, die es axis Eigenschaft vertical-horizontal ändert sich, wenn es Super von Hoch- auf Querformat dreht. Das Problem ist, dass dies zu einer Animation der beiden angeordneten Unteransichten führt, wobei eine dieser Ansichten die andere Ansicht überlappt, während sie an die neue Position übergeht.Unable Achse Animation von `UIStackView`

In meinem Fall möchte ich nur diese bestimmte Animation entfernen und die Ansicht sofort auf ihre Endposition zwingen.

Ich habe versucht, alle Animationen auf der stackview Schicht in meinem VC zu entfernen:

public override func willTransition(to newCollection: UITraitCollection, 
            with coordinator: UIViewControllerTransitionCoordinator) { 

    coordinator.animate(alongsideTransition: { 
     _ in 
     // The first subview is `UIStackView`   
     self.view.subviews[0].layer.removeAllAnimations() 
    }) 

    super.willTransition(to: newCollection, with: coordinator) 
} 

Und ich beobachtete den Animations-Keys, wenn die axis Eigenschaft geändert wird, denn das ist irgendwo während des Übergangs zu passieren scheint (wird automatisch vom Interface Builder gesetzt). Leider hatte ich kein Glück damit, da der Layer nil für animationKeys auf der Stackview und seinen Subviews/arrangedSubviews zurückgibt.

class StackView : UIStackView { 

    override var axis: UILayoutConstraintAxis { 

     didSet { /* here */ } 
    } 
} 

Antwort

0

Das wird herausfordernd, denke ich. Es gibt eine nette Demo von dem, was es klingt wie du versuchst zu tun over here wenn die Achse Animation es zeigt, was du versuchst loszuwerden, ziemlich sicher, dass das außerhalb des UIStackView Entwurfsraumes ist.

Ziemlich sicher ist die beste Lösung, um "die Sicht auf ihre Endposition sofort zu erzwingen", tatsächlich ein UIStackView für jede Achse zu haben und den Inhalt zwischen ihnen bei Rotation zu bewegen.

Sie könnten auch versuchen, einen performWithoutAnimation Block in Ihre viewWillTransition(to:with:) setzen, die updateConstraintsIfNeeded nach Abschluss ruft? Vielleicht würde das funktionieren. Ich würde stattdessen mit der Zwei-Ansichten-Idee gehen!