同时动画两个 UIView 子视图不起作用

Posted

技术标签:

【中文标题】同时动画两个 UIView 子视图不起作用【英文标题】:Animating two UIView subviews at the same time does not work 【发布时间】:2013-04-15 21:14:18 【问题描述】:

由于某种原因,我无法为两个子视图位置设置两个动画。我写了以下内容

[self addChildViewController:self.photosViewController];
[self.photosViewController.view setFrame:CGRectMake(0, -self.view.frame.size.height,    self.view.frame.size.width, self.view.frame.size.height)];

[self.view addSubview:self.photosViewController.view];

[UIView animateWithDuration:1 delay:0
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^

                         [self.stepsView setFrame:CGRectMake(0, self.view.frame.size.height, self.view.frame.size.width, self.view.frame.size.height)];
                         [self.photosViewController.view setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
                     
                     completion:^(BOOL finished) 
                         if (finished) 

                             button.tag = 0;
                         
                     ];

self.stepsViewIBOutlet UIViewself.photosViewController.view 是已添加到视图的子视图控制器视图。

使用当前代码,只有 self.PhotosViewController.view 动画。但是,如果我注释掉将子视图控制器视图添加为subview 的行,那么self.stepsView 的动画效果正确。

即使我在调用此方法之前添加子视图控制器及其视图,也会发生相同的错误。

几个月前我在使用另一个应用程序时遇到了这个问题并且不得不做一个肮脏的黑客来解决它,现在想要解决这个问题。

谢谢

【问题讨论】:

调用该动画块时 self.stepsView 是否非零? 你为什么同时调用 addChildViewController 和 addSubView? @jsd 它在 IB 中,我从不将其从视图中删除,因此永远不会为零 @sixthcent 因为根据我对苹果文档和视频的理解,他们说应该始终将要添加为子视图的视图的视图控制器添加为视图控制器的子视图控制器也添加......如果这有意义的话。 我的评论是由您的声明提示的,如果您注释掉 addSubview 部分,则视图会动画。看起来你可能必须做两个单独的动画,一个接着一个。如果在第一个动画中隐藏stepsView,然后在completion handler中启动动画显示photosView,或许可以达到你想要的效果。 【参考方案1】:

在View Programming Guide 的视图动画部分中,有一个specific mention 介绍了如何为子视图设置动画。

基本上,您应该使用transitionWithView:duration:options:animations:completion: 而不是animateWithDuration:delay:options:animations:completion:

【讨论】:

谢谢,抱歉回复晚了,我已经标记了这个答案【参考方案2】:

第一个视图将不可见,因为它的 origin.y 超出了可见视图的高度。如果在动画开始时它不可见,您当然什么也看不到。

第二个视图被改变以填满屏幕。同样,您看到的内容取决于它的初始位置。

【讨论】:

很抱歉应该提到。我故意将 photosViewController 设置在视图上方。动画的重点是为屏幕下方的 self.stepsView 设置动画,同时在合理的情况下将 self.PhotosViewController.View 从顶部设置到屏幕上。另请注意,这两个动画都有效。就是不在一起。如果我将 self.PhotosViewController.view 添加为子视图,则 self.stepsView 根本不会动画,只会在另一个动画时保持静止。 其中一个视图是否具有非标识transform?如果是这样,您不能为框架设置动画,但应该使用 center 来代替。 另外,它可能与视图的相对位置有关。试试insertSubview:atIndex:0 而不是insertSubview:

以上是关于同时动画两个 UIView 子视图不起作用的主要内容,如果未能解决你的问题,请参考以下文章

视图不在屏幕时的 UIView 动画 alpha 不起作用

通过动画调整 UIView 大小时约束不起作用

UIView subView alpha 动画不起作用

为啥在添加视图后立即启动 UIView 动画不起作用?

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

TapGestureRecognizer 在 UIView 子视图中不起作用