2015-09-08 30 views
5

I przeniesione mój kod Swift 1.2 do Swift 2.0iOS 9 Breaks animacje UILabel

w Swift 1.2/systemów iOS 8, animacja po prostu działa. Ale w iOS 9 nie animuje go, Etykieta zmienia pozycję natychmiast, tak jakby nigdy nie była wywoływana layoutIfNeeded.

Oto jak ożywam mój UILabel i UIButton. (Używam autoLayout, dlatego używam layoutIfNeeded)

KORZYSTANIA UILabel (NIE DZIAŁA)

titleLabelTopConstraint.constant = 88; 

UIView.animateWithDuration(0.8, delay: 0.38, usingSpringWithDamping: 0.54, initialSpringVelocity: 1, options: UIViewAnimationOptions.CurveLinear, animations: {() -> Void in 
     self.titleLabel.layoutIfNeeded(); 
     }, completion: nil); 

KORZYSTANIA UIBUTTON (działa IT)

buttonTopConstraint.constant = 88; 

UIView.animateWithDuration(0.8, delay: 0.38, usingSpringWithDamping: 0.54, initialSpringVelocity: 1, options: UIViewAnimationOptions.CurveLinear, animations: {() -> Void in 
     self.button.layoutIfNeeded(); 
     }, completion: nil); 

Jednak gdybym zrób to samo na Uibuttonie, działa!.

Jakieś myśli? Dlaczego UILabel nie jest animowalny?

Odpowiedz

6

spróbuj dodać:

self.titleLabel.setNeedsLayout(); 

przed blokiem animacji.

+0

To rozwiązuje. Ale dlaczego? – JayVDiyk

+2

Ogólnie po aktualizacji wiązania w widoku należy poinformować system układu iOS, że ograniczenie zostało zmienione za pomocą metody setNeedsLayout. Jest to optymalizacja wydajności firmy Apple, która nie próbuje niepotrzebnie układać widoku. Co do tego, dlaczego działa na Uibuttonie, nie mogę powiedzieć tego na pewno. Apple może wywoływać setNeedsLayout pod maską w implementacji UIButton. –

+0

dzięki. to rozwiązuje. Dzieje się tak tylko w iOS9. – JayVDiyk