2013-05-05 69 views
2

我第一次玩iOS 6自動佈局,我想弄清楚如何混合自動佈局和動畫。iOS 6動畫大小的視圖和約束移動其他視圖

我有容器視圖,ViewA,這是一定的高度。我有一個UIDatePicker,ViewB,它的高度爲216,並且有一個約束來設置ViewA和ViewB = 0之間的垂直空間,所以ViewB基本上固定在ViewA的底部。

enter image description here

我想動畫ViewA的高度,使其體積更小,並有ViewB保持盯住ViewA底部的整個時間。

[UIView animateWithDuration:2.0 animations:^{ 
    CGRect containerFrame = self.tableContainerView.frame; 
    containerFrame.size.height -= self.datePicker.frame.size.height; 
    self.tableContainerView.frame = containerFrame; 

} completion:^(BOOL finished) { 
    NSLog(@"Done"); 
}]; 

ViewA是容器視圖,按預期變短,但ViewB不遵循。

如何獲取ViewA和ViewB之間的約束,以在動畫期間自動調整ViewB的位置?

+0

您可能會在我的關於動畫和自動佈局的書中找到有用的討論。基本上它們相互衝突 - 在我看來,這是自動佈局的巨大缺點。就好像自動佈局的人忘了在創建iOS 6時向動畫人員諮詢。以下是該書中該部分的鏈接:http://www.apeth.com/iOSBook/ch17.html#_animation_and_autolayout – matt 2013-05-06 02:23:31

回答

3

它看起來像你的約束,它應該工作。問題可能是你做動畫的方式。你應該用約束來做到這一點,而不是框架。如果viewA對superview的底部有一個約束,那麼你可以動畫這個約束的常量。做一個IBOutlet到底層約束,並做到這一點(bottomCon是在我的例子出口):

self.bottomCon.constant = self.datePicker.bounds.size.height; 
[UIView animateWithDuration:2.0 animations:^{ 
    [self.view layoutSubviews]; 
    [self.containerView layoutSubviews]; 
} completion:^(BOOL finished) { 
    NSLog(@"Done"); 
}]; 

在我的編輯,我還添加了[self.containerView layoutSubviews]線。這是必要的,以便它的子視圖也可以正確更新(否則他們只是跳到新的位置)。

+0

ViewA沒有高度限制。我應該怎麼做? ViewA具有頂部空間約束= Superview和底部空間約束= Superview,因此它對於3.5「和4」設備是靈活的。 – 2013-05-06 02:05:39

+0

@KennyWyland,我認爲它對日期選擇器不是超級視圖有一個底部約束。剔除器是否在屏幕底部? – rdelmar 2013-05-06 02:09:22

+0

@KennyWyland,我根據你的評論編輯了我的答案。這應該通過日期選擇器的高度來縮短視圖。 – rdelmar 2013-05-06 02:23:33