iOS 动画视图,包括子视图

Posted

技术标签:

【中文标题】iOS 动画视图,包括子视图【英文标题】:iOS animating a view including subviews 【发布时间】:2012-05-15 15:33:12 【问题描述】:

我正在尝试制作一个动画来折叠包含一些子视图的视图。

[UIView beginAnimations:@"advancedAnimations" context:nil];
[UIView setAnimationDuration:3.0];

CGRect aFrame = aView.frame;
aView.size.height = 0;
aView.frame = aFrame;

[UIView commitAnimations];

此动画效果很好,但仅适用于 aView。子视图没有按预期折叠。 如何使子视图也折叠?另外,有没有办法在折叠后重新计算原始大小?

谢谢

【问题讨论】:

【参考方案1】:

您可能忘记为您的子视图应用一些自动调整大小的掩码。如果你这样做了

for (UIView *subview in aView.subviews) 
    subview.autoresizingMask = (UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin);

它应该可以工作。

但是, 正如lamelas所说,我个人会使用

aView.transform = CGAffineTransformMakeScale(1.0,0.0);

【讨论】:

还是不错的,但我想做的是折叠视图,当它变小时隐藏它的内容。 CGAffineTransformMakeScale 缩放整个内容。顺便说一句,你不能在转换中使用 0.0。 您在哪里看到我们不能在转换中使用 0.0 ?无论如何,我不确定您的问题是什么……您希望您的子视图缩放到,还是希望它们在动画发生时被裁剪? 尝试将其设置为 0.0 并查看动画的外观并将其与设置为 0.001 进行比较。我不是要调整子视图的大小,而是要具有“滑动门”效果,因为主视图变小了。 好的,那么您只需将主视图的属性 clipToBounds 设置为 YES 即可。 关于在变换中设置零值(CGAffine + CA3D 的),ios 6+ 似乎让它滑动并适当地动画。 “.001”技巧是实现兼容性的方法。【参考方案2】:

尝试使用它来制作动画:

aView.transform = CGAffineTransformMakeScale(1.0,0.0);

【讨论】:

效果更好,但动画有点奇怪 - 试图将视图“挤压”到中间点。【参考方案3】:

有根据的猜测:

[UIView beginAnimations:@"advancedAnimations" context:nil];
[UIView setAnimationDuration:3.0];

CGRect aFrame = aView.frame;
aView.size.height = 0;
aView.frame = aFrame;

for (UIView *subview in aView.subviews) 
    CGRect frame = subview.frame;
    frame.size.height = 0;
    subview.frame = frame;


[UIView commitAnimations];

另外,有没有办法在折叠后重新计算原始大小?

您可能只想在折叠之前保存高度。

【讨论】:

【参考方案4】:

设置autoresizingMask 的Swift 语法与ObjC 略有不同:

for subview in view.subviews 
    subview.autoresizingMask = [.flexibleWidth, .flexibleLeftMargin, .flexibleRightMargin]

【讨论】:

以上是关于iOS 动画视图,包括子视图的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 子视图不使用帧更改进行动画处理

iOS 使用动画块转换视图

iOS:动画子视图而不调用 layoutSubviews

带有自动布局的新子视图的 iOS 7+ 缩放动画

为“幻灯片”iOS UIView 设置动画,但关联的子视图不移动

如何通过许多子视图保持 iOS 动画流畅