日常咱們實現動畫都是直接調整frame,使用autolayout以後,建議調整constraint佈局
如上圖的約束都是能夠經過拖動,拖到.h或者.m文件中的,也是經過IBOutlet標識的動畫
若是你寫成下面的代碼, 發現動畫是不生效的spa
[UIView animateWithDuration:1.0 animations:^{ if (self.view.tag) { _xConstraint.constant = 20.0; } else { _xConstraint.constant = self.view.bounds.size.width - 120.0; } }];
你發現你添加的視圖是直來直去的,沒有動畫code
其實須要使用下面的代碼,來改變約束,產生動畫blog
[UIView animateWithDuration:1.0 animations:^{ if (self.view.tag) { _xConstraint.constant = 20.0; } else { _xConstraint.constant = self.view.bounds.size.width - 120.0; } // 告訴自動佈局系統,若是佈局變化,更新佈局 [self.view layoutIfNeeded]; }];
經過layoutIfNeeded,方法告訴視圖,當其子視圖發生變化的時候,更新佈局,而後再將這個動做包裹到動畫代碼中
或者下面的代碼也能夠,先改變約束,而後將通知視圖刷新的代碼寫到動畫塊裏animation
if (self.view.tag) { _xConstraint.constant = 20.0; } else { _xConstraint.constant = self.view.bounds.size.width - 120.0; } [UIView animateWithDuration:1.0 animations:^{ // demoView setFrame; // demoView setCenter; // 告訴自動佈局系統,若是佈局變化,更新佈局 [self.view layoutIfNeeded]; }];