1

我正在使用自定义 segue 在两个视图控制器之间导航。自定义 segue 使用 CGAffineTransformMakeScale 在目标控制器上创建缩放效果。

当我以纵向模式运行项目时,一切正常,但是当我更改为横向时,出现了问题。目标控制器以纵向显示在屏幕上,然后动画到正确的比例(1.0、1.0),当动画完成时,它会更改为正确的方向。这对我来说真的很困惑,我在网上找不到任何关于这个问题的东西,所以任何帮助都将不胜感激。

我用来测试的项目使用了两个视图控制器,每个控制器都有一个触发 segue 的按钮。

这是我的 CustomZoomSegue.m 文件:

#import "CustomZoomSegue.h"

@implementation CustomZoomSegue

- (void)perform
{
    UIViewController *destinationViewController = (UIViewController *)self.destinationViewController;
    UIViewController *sourceViewController = (UIViewController *)self.sourceViewController;
    UIWindow *mainWindow = [[UIApplication sharedApplication].windows objectAtIndex:0];

    UIView *sourceView = [sourceViewController view];
    UIView *destinationView = [destinationViewController view];

    destinationView.frame = sourceView.frame;
    [mainWindow addSubview:destinationView];

    [destinationView setAlpha:0.0f];
    [destinationView setTransform:CGAffineTransformMakeScale(0.0, 0.0)];

    // slide newView over oldView, then remove oldView
    [UIView animateWithDuration:0.8
                     animations:^{
                         [destinationView setTransform:CGAffineTransformMakeScale(1.0, 1.0)];
                         [destinationView setAlpha:1.0f];
                     }
                     completion:^(BOOL finished){
                         [destinationView removeFromSuperview];
                         [sourceViewController presentViewController:destinationViewController animated:NO completion:nil];
                     }];
}

@end

有谁知道为什么会这样?它快把我逼疯了

4

2 回答 2

0

我猜这个问题可能与在呈现视图控制器之前为目标视图设置动画有关。控制器参与视图旋转,但在呈现之前不会要求它旋转。我认为如果你先呈现然后使用源视图和目标视图的图像来制作动画,你会得到更好的结果。

于 2013-08-09T12:12:25.133 回答
0

我通过将目标视图作为子视图添加到源视图来实现这一点。在我将它直接添加到主窗口之前。

这是在动画块中同时管理缩放和缩放的代码:

- (void)perform
{
    UIViewController *sourceViewController = (UIViewController *) self.sourceViewController;
    UIViewController *destinationViewController = (UIViewController *) self.destinationViewController;

    [sourceViewController.view addSubview:destinationViewController.view];
    [destinationViewController.view setFrame:sourceViewController.view.window.frame];

    [destinationViewController.view setBounds:sourceViewController.view.bounds];
    CGSize screenSize = [[UIScreen mainScreen] bounds].size;
    [destinationViewController.view setCenter:CGPointMake(screenSize.width/2 + 127, screenSize.height/2 - 138)];

    [destinationViewController.view setTransform:CGAffineTransformMakeScale(0.0,0.0)];

    [UIView animateWithDuration:1.8
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseOut
                     animations:^{
                         [destinationViewController.view setAlpha:0.0];
                         [destinationViewController.view setTransform:CGAffineTransformMakeScale(1.0,1.0)];
                         [destinationViewController.view setAlpha:0.8];
                     }
                     completion:^(BOOL finished){
                         [destinationViewController.view setAlpha:1.0];
                         [destinationViewController.view removeFromSuperview];
                         [sourceViewController presentViewController:destinationViewController animated:NO completion:nil];
                     }];
}
于 2013-08-12T10:49:32.657 回答