像這樣改變框架並不是最好的方法來做到這一點,它的老式。最好的方法是訪問視圖上的某個自動佈局約束,並對其進行更改。例如 - 比如你的tableview有一個頂端約束,它定義了tableview頂部和superview之間的差距 - 例如10px。從IB拖動那個約束到你的類中。最好的方法是突出顯示IB左側的約束,在包含所有視圖的列表中拖動。使其成爲類中的屬性,就像使用按鈕或標籤一樣。然後在運行時,更改該約束的.constant屬性。例如。我的繼承人NSLayoutConstraint屬性時,整個拖入類:
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *topBuffer;
然後在您希望此舉發生在代碼中的點,你改變不變的性質,動畫調用的外部:
self.topBuffer.constant = 50; //<-- or whatever the new value is
然後你只需要在動畫塊中調用[self.view layoutIfNeeded]。順便說一下 - 注意這裏我使用了彈簧等動畫塊來獲得反彈效果。另外請注意 - layoutIfNeeded在你正在改變的對象的超視圖上調用 - 所以self.view在這裏是我的主超視圖,它包含tableview。
[UIView animateWithDuration:0.7f delay:0 usingSpringWithDamping:1.0 initialSpringVelocity:0 options:UIViewAnimationOptionCurveEaseIn animations:^(void) {[self.view layoutIfNeeded];} completion:nil];
如果您使用的是自動佈局,那麼幀上的操作將不起作用或工作不正常。嘗試使用轉換。 – Kegluneq
user1963877說得很好。 –
是的,轉換作品,但它不是一個動畫。不管怎麼說,還是要謝謝你。 –