iPhone:如何从左到右制作当前的模态视图控制器动画

Posted

技术标签:

【中文标题】iPhone:如何从左到右制作当前的模态视图控制器动画【英文标题】:iPhone: How to do a presentModalViewController animation from left to right 【发布时间】:2010-12-27 19:33:32 【问题描述】:

我正在展示一个带有动画的模型视图。默认情况下,它是从下到上的。如何使动画从左到右?我知道我可以使用导航控制器。但实际上呈现视图不需要导航栏,模态呈现视图也不需要导航栏。我仍然想要从左到右的过渡。

【问题讨论】:

一个可能的副本,其中包含用于关闭具有从右到左反向动画的 modalViewController 的附加信息:- ***.com/questions/11412467/… dismissModalViewController with transition: left to right的可能重复 【参考方案1】:

您可以使用以下代码在呈现视图控制器时从右到左设置动画

CATransition *transition = [CATransition animation];
            transition.duration = 0.4;
            transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
            transition.type = kCATransitionPush;
            transition.subtype = kCATransitionFromRight;
            [self.view.window.layer addAnimation:transition forKey:nil];
            [self presentViewController:localitiesView animated:NO completion:nil];

【讨论】:

真棒解决方案,这对我来说真的很好,但我遇到了一个问题。你知道为什么我会在视图动画时出现黑色闪光吗?【参考方案2】:

UIModalTransitionStyles 只有四个:

UIModalTransitionStyleCoverVertical
UIModalTransitionStyleFlipHorizontal
UIModalTransitionStyleCrossDissolve
UIModalTransitionStylePartialCurl

就像你说的,导航控制器会朝那个方向推进。如果您不想使用它,则必须自己为视图设置动画。

【讨论】:

我没有做过,但基本上你会实例化viewController,将其hidden属性设置为YES,呈现模态控制器,将其frame.origin.x移动到-320(纵向模式),将其hidden 属性设置为NO,开始您的动画块,在1.01.5 秒的时间段内将frame.origin.x 设置为0,然后开始动画。【参考方案3】:

我在实现 Matthew 的解决方案时遇到了问题,因为在动画期间呈现我的模态视图的视图将不可见(而是呈现视图将被替换为窗口背景,然后模态视图将在其上进行动画处理)导致不和谐的经历。相反,我将模态视图作为子视图添加到呈现的 UIViewController 的视图中,并对其进行动画处理。我请求了不同的动画,因此我尝试更改一些值来表示您所描述的动画,但我还没有实际测试过下面的代码。

    UIViewController *modalView = //init your UIViewController
    [modalView loadView];
    CGRect finalFrame = modalView.view.frame;
    [modalView.view setFrame:CGRectMake(-320, 0, self.view.frame.size.width, self.view.frame.size.height)];
    [UIView animateWithDuration:1.0 animations:^
                    [self.navigationController setNavigationBarHidden:YES];
                    [self.view addSubview:modalView.view];
                    [modalView.view setFrame:finalFrame];
                ];

希望这会有所帮助。

【讨论】:

【参考方案4】:

UINavigationController 有一个navigationBarHidden 属性——如果您将其设置为 YES,您可以在没有可见导航栏的情况下获得从左到右的过渡样式和导航控制器的其他细节。

【讨论】:

【参考方案5】:

只是想显示另一个选项 - 这个选项允许您使用 UIView 动画从上到下呈现视图。 请注意,您必须在隐藏状态下添加新视图 - 确保动画在视图完全加载时开始。

AddViewController *controller = [[AddViewController alloc] initWithNibName:@"AddViewController" bundle:[NSBundle mainBundle]];
    controller.blogs = self.blogs;
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
    navController.toolbarHidden = YES;
    navController.navigationBarHidden = YES;
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentModalViewController:navController animated:NO];

    navController.view.frame = CGRectMake(0, -480, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height - 20);
    navController.view.hidden = NO;
    [UIView animateWithDuration:0.3
                     animations:^
                         navController.view.frame = CGRectMake(0, 20, navController.view.frame.size.width, navController.view.frame.size.height);
                     ];

【讨论】:

【参考方案6】:

你可以试试这样的:

   UIViewController *fooViewController = [[[UIViewController alloc] init] autorelease];

        CGSize theSize = CGSizeMake(320, 460);
        fooViewController.view.frame = CGRectMake(0 - theSize.width, 0, theSize.width, theSize.height);
        [UIView beginAnimations:@"animationID" context:NULL];

        fooViewController.view.frame = CGRectMake(0, 0, 320, 460);

        [UIView commitAnimations];

【讨论】:

感谢您的回答。它给了我两个编译错误。我也不太确定这是在做什么。 它正在做我之前建议的事情:创建一个 viewController,将其框架设置为正好在屏幕左侧的宽度,启动一个持续 1 秒的动画块,告诉 UIKit 动画师它应该将 viewController 向右移动,直到它在那 1 秒内填满屏幕,然后执行动画。你的编译错误是什么?奇怪的是,您不希望像这样创建一个空的 viewController,而是在您的 viewController 的类中替换第一行中的UIViewController 在上述第 5 条语句中:无效转换初始化整数 'int',预期块指针。在上面的第 7 条语句中:左值需要作为赋值的左操作数

以上是关于iPhone:如何从左到右制作当前的模态视图控制器动画的主要内容,如果未能解决你的问题,请参考以下文章

如何防止在水平滚动方向上从左到右滚动集合视图?

你如何使 UIView 的幻灯片从左到右并在 iPhone 中相互对接?

如何将 viewPager 的方向反转为从左到右的顺序?

如何以编程方式在 iPhone 应用程序中从左到右移动文本? [关闭]

IOS / Objective-C / Storyboard:从左到右的自定义Segue在视图控制器之间创建黑条

如何在从左到右滑动时禁用 ViewController 关闭?