2013-05-05 87 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