使用自动调整子视图大小为 UIView 帧大小更改动画

Posted

技术标签:

【中文标题】使用自动调整子视图大小为 UIView 帧大小更改动画【英文标题】:Animating UIView frame size change with autoresizing subviews 【发布时间】:2011-12-21 16:36:31 【问题描述】:

我有一个包含两个子视图的 UIView。我想用动画改变超级视图的帧大小,并让子视图的大小根据它们的自动调整大小掩码而改变。

[UIView beginAnimations:@"Resize" context:nil];
[UIView setAnimationDuration:1.0];
CGRect frame = self.myView.frame;
frame.size.height += 30.0;
self.myView.frame = frame;
[UIView commitAnimations];

视图 self.myView 按预期调整大小超过 1 秒,但子视图正在立即调整大小。有谁知道为什么会发生这种情况以及我如何使子视图也为它们的大小调整设置动画?

根据我的谷歌搜索,我认为这可能与 contentMode 属性有关。不幸的是,我不太清楚该属性的作用。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

如果没有看到你的代码,其他人很难给你正确的答案,尽管我会问你在[UIView commitAnimations] 之后你在做什么。不过,很高兴你想通了。我建议你使用块动画。通过使用完成块,它们使此类错误更容易避免。示例:

[UIView animateWithDuration:1.0
                 animations:^
                     CGRect frame = self.myView.frame;
                     frame.size.height += 30.0;
                     self.myView.frame = frame;
                 
                 completion:^(BOOL finished)
                     // whatever you need to do when animations are complete
                 ];

【讨论】:

不幸的是,需要与旧版本的 ios 兼容排除了块动画。不过感谢您的提示。 有道理。虽然现在 【参考方案2】:

好的,所以我在阅读以下问题的答案后发现了问题:Animating a UIView frame, subview UIScrollView doesn't always animate

我基本上是在安排动画后做一些工作,这导致在我的每个子视图上调用 -layoutSubviews,这会自动导致这些视图被安排在动画的终点。通过在这项工作完成后安排我的动画,我能够解决我的问题。

【讨论】:

以上是关于使用自动调整子视图大小为 UIView 帧大小更改动画的主要内容,如果未能解决你的问题,请参考以下文章

根据设备方向在 alloc/init 上设置正确的 UIView 帧大小

UIView 子视图不是为 iPad 自动旋转或自动调整大小

创建一个基于 UIView 的子视图自动调整大小的视图

如何在加载了 nib 文件的 UIView 中调整子视图的大小

自动布局:ViewDidAppear 中的帧大小不正确

使用自动布局调整同级视图的大小时,使用子视图重新定位 UIView 不起作用