1

我正在尝试编写一个应用程序,该应用程序使用自定义动画在 UINavigationController 的视图堆栈中的视图控制器之间进行转换。

现在,我正在添加同一个视图的多个后期,只是为了让机制正常运行。

我的视觉目标如下:
1. 创建一个新的“FirstVC”。
2. 将[FirstVC view] 的alpha 值设置为0。
3. 将[FirstVC view] 的transform 值设置为两个方向(垂直和水平)的25%。

在动画块中,我想要完成的是:
1. 将 [OutgoingVC view] 的变换值设置为双向 500%(将其放大 5 倍)。
2.将[OutgoingVC view]的alpha值设置为0(淡出为空)。
3. 将[FirstVC view]的transform值设置为1(恢复到原来的大小)。4. 将[FirstVC view]的alpha值设置为1(淡入为全色)。

这个动画的最终效果应该是“首页”炸开并淡出,而“下一页/底部页面”炸开(仅全屏)并淡入。这个想法是用户从地板上掉下来或某物。“再深入一点。”

我已将动画减慢到 10.0 秒的间隔,以便更好地了解正在发生的事情。

看来“OutgoingVC”(即顶视图)上发生的动画是正确的。然而,底部视图似乎很好(100% 的屏幕尺寸和 alpha=1.0),但它会继续运行,并且似乎会放大到 4x/5x 并且也会淡出到 0 的 alpha。一旦屏幕完全变黑,新的 UIViewController (FirstVC) 正确显示在屏幕上。

有谁知道为什么我的代码不会按照我想要的方式运行?

谢谢!


愚蠢的我!这是代码:

- (IBAction)AddNewScreenPressed:(id)sender 
{
    FirstVC *newViewController = [[FirstVC alloc] init];
    UIView *currentView = [self view];
    UIView *newView = [newViewController view];
    [newView setTransform:CGAffineTransformMakeScale(0.25, 0.25)];
    [newView setAlpha:0];
    [UIView transitionWithView:[self view]
                      duration:10.0
                       options:UIViewAnimationOptionCurveEaseInOut
                    animations:^{
                        [[self view] addSubview:newView];
                        [currentView setAlpha:0];
                        [currentView setTransform:CGAffineTransformMakeScale(5.0, 5.0)];
                        [newView setAlpha:1.0];
                        [newView setTransform:CGAffineTransformMakeScale(1, 1)];
                    }
                    completion:^(BOOL finished){
                        [[self navigationController] pushViewController:newViewController animated:NO];
                    }
     ];
}
4

2 回答 2

1

您已将 newView 添加为 currentView 的子视图,因此您对 currentView 所做的动画可能也适用于 newView - 它可能会按比例放大并更改其子视图的 alpha,包括 newView。您能否将 newView 的初始比例设为 0.2,并在动画块中删除 newView 的重新缩放,使其最终以 1.0 比例结束?不知道该怎么处理阿尔法,虽然......

在看到下面的解决方案后进行编辑 - 很高兴你已经让它工作了,它可能会更干净(如果你从屏幕上抓取图像来处理你的视图)有一个单独的视图控制器来管理转换,将它传递给两个图像,因此它可以在内部执行动画,因此您将其推到前面而没有动画,从第一个视图的图像开始执行动画并以第二个视图的图像结束(因此您可以只在两个 imageViews 上执行标准动画,而不是控制器的整个视图),然后在完成后推送第二个视图控制器?

于 2011-08-08T15:49:22.357 回答
1

在玩了一段时间之后,我克服了一个障碍,遇到了另一个障碍。

我赞成 jrturton 的回答,因为这个问题确实似乎与我将新视图添加到 [self view] 的事实有关。

为了解决这个问题,我在 [self view] 及其子视图之间添加了一个缓冲区视图([self BackView])。

然后,下面的代码可以推送一个新的视图控制器:

- (IBAction)AddNewScreenPressed:(id)sender 
{
    FirstVC *newViewController = [[FirstVC alloc] init];
    UIView *newView = [newViewController view];
    [newView setAlpha:0];
    [newView setTransform:CGAffineTransformMakeScale(0.25, 0.25)];
    [[self view] addSubview:newView];
    [UIView transitionWithView:[self view]
                      duration:1.0 
                       options:UIViewAnimationOptionCurveEaseInOut
                    animations:^{
                        [[self BackView] setTransform:CGAffineTransformMakeScale(5, 5)];
                        [[self BackView] setAlpha:0];
                        [newView setTransform:CGAffineTransformMakeScale(1, 1)];
                        [newView setAlpha:1];
                    }
                    completion:^(BOOL finished){
                        [newView removeFromSuperview];
                        [[self navigationController] pushViewController:newViewController animated:NO];
                        [[self BackView] setTransform:CGAffineTransformIdentity];
                        [[self BackView] setAlpha:1];
                    }
     ];
}

现在,当然,我遇到了另一个问题,即弹出控制器。

当我弹出它们时,动画似乎工作得很好,但是当我到达最后(完成块)并执行以下操作时:
[[self navigationController] popViewControllerAnimated:NO];
甚至:
[[self navigationController] popViewControllerAnimatedYES];
我最终得到的是一个空白的白色屏幕。

我假设我在“推送动画”期间正在做的事情导致了这个问题,但我无法弄清楚!帮助!

谢谢!

于 2011-08-08T16:45:01.600 回答