Xcode 自定义转场 - Cover Vertical 的对面(从上到下) - 完整新手

Posted

技术标签:

【中文标题】Xcode 自定义转场 - Cover Vertical 的对面(从上到下) - 完整新手【英文标题】:Xcode custom segue - Opposite of Cover Vertical (top to bottom) - COMPLETE NEWBIE 【发布时间】:2012-12-29 12:51:51 【问题描述】:

一段时间以来,我一直在尝试创建与垂直封面相反的自定义 segue(以创建从上到下的效果动画)。我查看了其他问题,google 和 youtube,但无法使其正常工作.我对课程等完全陌生,因此分步指南或视频中的任何帮助都会非常好。我相信这个 URL 正在尝试做一些类似于我想要的事情:

http://jrwren.wrenfam.com/blog/2012/02/01/storyboard-custom-segue-for-custom-pushviewcontroller-animation/,我就是无法正常工作。

如果你们中有人知道一种方法来创建一个从上到下版本的封面垂直转场,请帮帮我吗?

【问题讨论】:

【参考方案1】:

好吧,您可能想要创建 UIStoryBoardSegue 的子类,就像演练向您展示的那样,但是在 Storyboard 类的 .m 文件(实现)下,您需要以下代码作为您的 -(void)perform:方法 -

-(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 setTransform:CGAffineTransformMakeTranslation(0, -sourceViewController.view.frame.size.height)];
[destinationViewController.view setAlpha:1.0];

[UIView animateWithDuration:0.75
                      delay:0.0
                    options:UIViewAnimationOptionTransitionFlipFromTop
                 animations:^
                     [destinationViewController.view setTransform:CGAffineTransformMakeTranslation(0, 0)];
                     [destinationViewController.view setAlpha:1.0];
                 
                 completion:^(BOOL finished)
                     [destinationViewController.view removeFromSuperview];
                     [sourceViewController presentViewController:destinationViewController animated:NO completion:nil];
                 ];

希望这会有所帮助。

【讨论】:

在将这行[destinationViewController.view setAlpha:1.0]; 离开动画块后,我意识到它是必需的,但谁能告诉我为什么?【参考方案2】:

以@dmason82 的回答为基础,翻译成 Swift,并稍微简化一下,这对我有用:

class UIStoryboardSegueFromTop: UIStoryboardSegue 
    override func perform() 
        let src = self.sourceViewController as UIViewController
        let dst = self.destinationViewController as UIViewController

        src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
        dst.view.transform = CGAffineTransformMakeTranslation(0, -src.view.frame.size.height)

        UIView.animateWithDuration(1.0, animations: 
            dst.view.transform = CGAffineTransformMakeTranslation(0, 0)

            )  (Finished) in
                src.presentViewController(dst, animated: false, completion: nil)
        
    

【讨论】:

问题是源视图控制器作为超级视图是活着的,在模态转换中只有目标视图控制器应该是活着的【参考方案3】:

这是我使用情节提要实现对面封面垂直转场

https://github.com/viccarre/OppositeCoverVerticalSegue

【讨论】:

感谢兄弟为我工作。我只是不知道在哪里放置该代码,谢谢【参考方案4】:

您好,我刚刚尝试了另外两个答案,但它没有按您的要求工作。 为了创建一个自定义的segue,看起来与cover vertical(模态segue默认)完全相反,我创建了这个代码:

- (void)perform

UIViewController *sourceViewController = self.sourceViewController;
UIViewController *destinationViewController = self.destinationViewController;


[sourceViewController presentViewController:destinationViewController animated:NO completion:nil];
[destinationViewController.view addSubview:sourceViewController.view];
[sourceViewController.view setTransform:CGAffineTransformMakeTranslation(0, 0)];
[sourceViewController.view setAlpha:1.0];

[UIView animateWithDuration:0.75
                      delay:0.0
                    options:UIViewAnimationOptionTransitionFlipFromBottom
                 animations:^
                     [sourceViewController.view setTransform:CGAffineTransformMakeTranslation(0,destinationViewController.view.frame.size.height)];
                     [sourceViewController.view setAlpha:1.0];
                 
                 completion:^(BOOL finished)
                     [sourceViewController.view removeFromSuperview];
                     ];




@end

【讨论】:

【参考方案5】:

要完成 dmason 的回答并让您的控制器朝相反的方向展开 - 从原来的位置返回,请在呈现的视图控制器中执行此操作:

[UIView animateWithDuration:0.75
                      delay:0.0
                    options:UIViewAnimationOptionTransitionFlipFromBottom
                 animations:^
                     [self.view setTransform:CGAffineTransformMakeTranslation(0, -self.view.frame.size.height)];
                 
                 completion:^(BOOL finished)
                     [self dismissViewControllerAnimated:NO completion:nil];
                 
 ];

Bergy 的回答对我不起作用。

【讨论】:

【参考方案6】:

dmason 的回答很棒,如果您想添加一个展开转场,以便您的模态在关闭时正确动画,您的执行操作可能如下所示(在新的自定义转场类中)

- (void)perform

    UIViewController *sourceViewController = self.sourceViewController;
    UIViewController *destinationViewController = self.destinationViewController;

    [sourceViewController dismissViewControllerAnimated:NO completion:nil];
    [destinationViewController.view addSubview:sourceViewController.view];

    [UIView animateWithDuration:0.75
                     animations:^
                         sourceViewController.view.center = CGPointMake(sourceViewController.view.center.x, sourceViewController.view.center.y-600);
                     
                     completion:^(BOOL finished)
                         [sourceViewController.view removeFromSuperview];
                     
     ];

【讨论】:

【参考方案7】:

我建议你使用 Hero 库来实现这一点。它添加了很多动画和过渡,特别是在视图控制器之间:https://github.com/lkzhao/Hero/blob/master/README.md 有一个过渡叫“Cover”,可以选择方向(左上右下)

【讨论】:

以上是关于Xcode 自定义转场 - Cover Vertical 的对面(从上到下) - 完整新手的主要内容,如果未能解决你的问题,请参考以下文章

swift自定义转场动画(比较有难度)

Focusky教程 | 自定义帧的转场时间

iOS自定义Push转场

第六十五篇iOS7自定义转场动画

关于自定义转场动画,我都告诉你。

自定义转场详解