2016-06-08 13 views
6

Ich habe eine UIStackView mit 5 Unteransichten. Ich möchte in der Lage sein, die Breite dieser Untersichten zu animieren, indem ich ihre intrinsicContentSize aktualisiere oder ihre Beschränkungen aktualisiere. Wie kann ich das stackView nach dem Aktualisieren des Unteransichtslayouts neu zeichnen?Wie bekomme ich ein UIStackView, um sein Layout zu aktualisieren?

Ich habe verschiedene Möglichkeiten versucht, um das StackView zu aktualisieren, aber nichts passiert. Der einzige Weg, wie ich es schaffen kann, ist, wenn ich eine andere Unteransicht innerhalb des Animationsblocks ein- oder ausgeblendet habe, dann wird das neue Layout korrekt animiert, aber ich möchte das nicht tun. Ich habe diese Frage gesehen Animating UIStackView arrangedSubview content size change aber die vorgeschlagene Antwort funktioniert nicht

+0

haben hast du view.updateConstraints ausprobiert? –

+0

Ja, in den StackViews und Subviews hat keiner einen Effekt. –

Antwort

6

Sie benötigen nicht viewToResize.invalidateIntrinsicContentSize(), Update-Einschränkung Ihrer Subviews stattdessen. Im folgenden Code haben wir zwei Unteransichten in der stackView, und wir erstellen eine widthConstraint Outlet von Storyboard. Dann können wir die Breite der Unteransicht animieren, indem wir die Konstante widthConstraint im Animationsblock aktualisieren. Hinweis: Wenn eine Ansicht, in einem Stapel Ansicht enthalten ist, und Sie versuchen, den Ansichtsrahmen zu ändern, sollte es nicht

class ViewController: UIViewController { 
    @IBOutlet var widthConstraint: NSLayoutConstraint! 

    @IBOutlet var stackView: UIStackView! 
    var compressed: Bool = true 

    @IBOutlet var start: UIButton! 

    @IBAction func onStart(sender: UIButton) { 
     UIView.animateWithDuration(3.0, 
            delay: 0.0, 
            usingSpringWithDamping: 0.3, 
            initialSpringVelocity: 10.0, 
            options: .CurveLinear, 
            animations: {() -> Void in 
            //self.stackView.invalidateIntrinsicContentSize() 
            self.widthConstraint.constant = (self.compressed == false) ? 100.0 : 200.0 
            self.compressed = !self.compressed 
            self.view.layoutIfNeeded() 
      }, completion: nil) 
    } 

Für weitere Details ändern, Sie einen Blick auf diesem großen Blog UIStackView, Auto Layout and Core Animation

+0

Wie würde ich dies tun, wenn ich möchte, dass 1 Unteransicht eine feste Breite hat und die andere, um den verfügbaren Platz zu füllen? (Ich möchte zwischen den Ansichten wechseln) Ich habe versucht, Constraints im Animationsblock zu entfernen/hinzufügen und es funktioniert, aber bricht andere Einschränkungen. –

+0

Das Hinzufügen und Entfernen der Einschränkungen funktioniert zwar gut, aber ich musste die Priorität verringern, um andere Einschränkungen zu stoppen. –

+0

Ich habe gerade den Link aktualisiert. – luiyezheng

Verwandte Themen