2015-03-25 3 views
14

Vor dem automatischen Layout habe ich die Höhe eines Hintergrunds in einem Projekt animiert, indem ich den Rahmen auf animateWithDuration gestellt habe.Animieren der UIView-Höhe bei Verwendung des automatischen Layouts mit swift

func setUpBackground() { 
    self.backgroundView.frame = CGRect(x: 0, y: 0, width: 320, height: 10) 
    self.backgroundView.backgroundColor = UIColorFromRGB(0x2d2d2d).CGColor 
} 

func AnimateBackgroundHeight() { 
    UIView.animateWithDuration(0.5, animations: { 
     self.backgroundView.frame = CGRect(x: 0, y: 0, width: 320, height: 600)  
    }) 
} 

Nachdem ich mein Projekt Auto-Layout konvertiert, bemerkte ich, dass die Animation stattfindet, aber die Hintergrund Höhe nach auf die ursprüngliche Größe/Stil (Interface Builder Einstellung) zurückschnappt. Ich habe gelesen, dass bei aktiviertem Auto-Layout die Einschränkungen überschrieben werden, indem die UIView Dimensionen mit CGRect festgelegt werden.

Daher frage ich mich, wie man den gleichen Höhenänderungseffekt mit Auto-Layout ON erreichen kann.

Antwort

35

Geben Sie Ihrem backgroundView eine Höhenbeschränkung und erstellen Sie ein IBOutlet. Ändern Sie im Code den konstanten Wert der Einschränkung.

func AnimateBackgroundHeight() { 
    UIView.animateWithDuration(0.5, animations: { 
     self.heightCon.constant = 600 // heightCon is the IBOutlet to the constraint 
     self.view.layoutIfNeeded()  
    }) 
} 
+0

Ah ich sehe! das funktioniert super. Danke vielmals. – Poyi

+0

omg .. layoutIfNeeded() hat den Trick gemacht ... ich habe es vermisst –

5

Auch für diejenigen, die diesen Beitrag finden versuchen, herauszufinden, warum ein Übergang eine Ansicht, die Größe zu verändern blockartig sein wird oder unsauber Sie brauchen nur die Aussicht verantwortlich zu finden und self.view.layoutIfNeeded() innerhalb des UIView.animateWithDuration Block nennen. Ich schlug meinen Kopf gegen die Wand, probierte verschiedene Dinge mit Einschränkungen aus und machte Frames, bis ich erkannte, dass self.view.layoutIfNeeded() den Übergang glatt machen wird, solange Sie ihn an der richtigen Stelle platzieren.

+1

Verbrachte 7 Stunden, um herauszufinden, warum mein Layout beim Animieren kaputtging. Nachdem ich Ihre Posts gesehen hatte, wurde mir klar, dass ich layoutIfNeeded für eine Unteransicht und nicht für die Superview aufruft. Vielen Dank!! – Starlord

Verwandte Themen