【问题标题】:iOS 6 animate size of view and have constraints move other viewsiOS 6 动画视图大小并有约束移动其他视图
【发布时间】:2013-05-05 23:21:16
【问题描述】:

我是第一次使用 iOS 6 自动布局,我正在尝试弄清楚如何混合使用自动布局和动画。

我有一个容器视图 ViewA,它有一定的高度。我有一个UIDatePicker ViewB,它有216 高,并且有一个约束将ViewA 和ViewB 之间的垂直空间设置为0,因此ViewB 基本上固定在ViewA 的底部。

我想为 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 的位置?

【问题讨论】:

  • 你可能会发现我的书中关于动画和自动布局的讨论很有用。基本上它们相互冲突——在我看来,这是自动布局的一个巨大缺点。好像自动布局的人在创建 iOS 6 时忘记咨询动画人。这是本书该部分的链接:apeth.com/iOSBook/ch17.html#_animation_and_autolayout

标签: ios ios6 core-animation autolayout


【解决方案1】:

从您的限制看来,它应该可以工作。问题可能出在您制作动画的方式上。您应该使用约束而不是框架来做到这一点。如果 viewA 对超级视图的底部有一个约束,那么您可以只为该约束的常量设置动画。为该底部约束创建一个 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] 行。这是必要的,这样它的子视图也能正确更新(否则它们只会跳转到新位置)。

【讨论】:

  • ViewA 没有高度限制。我该怎么做? ViewA 有一个 Top Space constraint=Superview 和一个 Bottom Space constraint=Superview,因此它对于 3.5" 和 4" 设备是灵活的。
  • @KennyWyland,我认为它对日期选择器而不是超级视图有一个底部约束。选择器是否离屏到底部?
  • @KennyWyland,我已根据您的评论编辑了我的答案。这应该会按日期选择器的高度缩短视图。
  • ViewA 填充超级视图以启动,是的,ViewB 不在屏幕底部。 ViewA 最初应该填充超级视图,但是当我想将 datePicker ViewB 动画到屏幕上时,我想缩短 ViewA 以为它腾出空间。
  • ViewB 连接到 ViewA 的底部,但 ViewA 没有连接到 B 的顶部。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
相关资源
最近更新 更多