2015-11-19 43 views
0

我正在使用Objective-C。我想讓表格視圖在動畫上向下移動,當我在它上面添加一個搜索欄時。這是我的代碼(表格這裏是我的表格視圖):UIView動畫工程出錯

[UIView animateWithDuration:0.3 animations:^{ 
    CGRect frame = self.table.frame; 
    frame.origin.y = frame.origin.y+30; 
    self.table.frame = frame; 
}]; 

但它不起作用。有人可以幫助我嗎?

+2

如果您使用的是自動佈局,那麼幀上的操作將不起作用或工作不正常。嘗試使用轉換。 – Kegluneq

+0

user1963877說得很好。 –

+0

是的,轉換作品,但它不是一個動畫。不管怎麼說,還是要謝謝你。 –

回答

0

在動畫塊的末尾添加layoutIfNeeded。像這樣:

[UIView animateWithDuration:0.3 animations:^{ 
    CGRect frame = self.table.frame; 
    frame.origin.y = frame.origin.y+30; 
    self.table.frame = frame; 
    [self.view layoutIfNeeded]; 
}]; 
+0

不幸的是它不起作用。我發現表格視圖會首先向上移動,然後向下移動,因此它可以返回原來的位置。 –

+0

這不會工作,因爲幀和自動佈局是不同的東西。 –

+0

@HongxuJin你使用autolayout嗎? – Solomiya

0

像這樣改變框架並不是最好的方法來做到這一點,它的老式。最好的方法是訪問視圖上的某個自動佈局約束,並對其進行更改。例如 - 比如你的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]; 
+0

謝謝,但一個新問題是我沒有自動佈局約束。我應該在什麼地方添加它? –

+0

Autolayout在iOS應用程序中非常重要。你在使用故事板嗎?如果是這樣,至少會更容易。最好看看一些初學者的自動佈局教程 - 你一定會一直需要這些東西!例如:http://www.raywenderlich.com/115440/auto-layout-tutorial-in-ios-9-part-1-getting-started-2 –