【问题标题】:3D Door Open Animation between two UIViewControllers两个 UIViewController 之间的 3D 开门动画
【发布时间】:2011-10-07 09:44:21
【问题描述】:

之前有人问过这个问题,但据我所知,在 stackoverflow 上找不到示例代码,也没有合适的解决方案。我有一个解决方案,但它看起来很糟糕。我将不胜感激任何输入和修​​改,以获得更逼真的 3D 开门/书籍封面动画。

目标是在 UIViewControllers 之间有一个动画,这样你就可以得到一个效果,就像你在打开一扇门或一本书的封面一样。 ViewController 2 是静态的并且在后台。在它上面放置 ViewController 1,它覆盖 ViewController 2。动画将打开 ViewController 1(就像一本精装书)并显示 ViewController 2(可以说是你的第一页,或者门后面的任何东西)。

首先要注意的是,您不能使用 UINavigationController 执行此操作,因为很难覆盖自定义动画。关于如何设置我们的两个 ViewController 的正确教程可以在这里找到:ViewController Animations

所以一旦一切都设置好了,这是我的自定义动画,看起来很糟糕。它基本上看起来好像你在向左挤压书的门/封面。恐怕没有3D的感觉。欢迎任何有关如何使其变得更好的建议:

-(void)openDoorTo:(UIViewController *)aController duration:(float)aDuration {


    [aController viewWillAppear:YES];
    [activeController viewWillDisappear:YES];

    [self.view insertSubview:aController.view belowSubview:activeController.view]; // so that it is below activeController

    [aController viewDidAppear:YES];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:aDuration];

    aController.view.transform = CGAffineTransformMakeTranslation(0,0);

    CATransform3D _3Dt = CATransform3DIdentity;
    _3Dt = CATransform3DTranslate(_3Dt, -320, 0, 0);
    _3Dt = CATransform3DRotate(_3Dt, M_PI * 1.5, 0.0, 1, 0.0);
    _3Dt = CATransform3DTranslate(_3Dt, 320, 0, 0);

    activeController.view.layer.transform = _3Dt;

    [UIView commitAnimations];

    [self performSelector:@selector(animationDone:) withObject:aController afterDelay:aDuration];


}

我认为主要问题是我真的不知道如何处理CATransform3DTranslateCATransform3DRotate

这里有一些关于此的帖子,但我真的不知道如何将它们应用到 3D 开门器:

3D Door - but Axis in the middle

3D Unfolding

【问题讨论】:

    标签: iphone cocoa-touch animation catransform3d


    【解决方案1】:

    你必须应用一个小技巧才能让 3D 工作:

    CATransform3D _3Dt = CATransform3DIdentity;
    _3Dt.m34 = 1.0 / -1000;
    

    这会创建透视变换。 1000 表示观察者到物体的距离(您可以试验这个值以获得平滑的外观)。

    【讨论】:

    • 谢谢,但我只收到未定义 _3Dtm34 的错误消息。 m34 是从哪里来的?如果我把它拿走,我也会收到一个错误(从不兼容的 double 类型分配给 CATransform3D'...抱歉,如果这很明显,但我不知道如何处理 m34。
    • 对不起,_3Dt.m34 之间必须有一个点...愚蠢的问题,对不起。
    • 在更实质的性质上:门现在打开到房间(或书)的内部。我怎么让它出来? IE。就像一本书的封面向你走来,却没有进入书本。我试图扭转与观察者的距离,以便获得 1.0 / 1000 但这不起作用。它只是完全破坏了动画。感谢您的耐心等待。
    • 天哪,我想这又是一个愚蠢的问题。我将它降低到 1.0 / 500,现在看起来很完美。非常感谢您的回答。毕竟没那么难!
    • tnx 动画效果很好,谁能告诉我如何反转这个动画?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多