如何在导航控制器中将过渡动画从底部更改为顶部?
Posted
技术标签:
【中文标题】如何在导航控制器中将过渡动画从底部更改为顶部?【英文标题】:How to change the transition animation from bottom to top in navigation controller? 【发布时间】:2014-03-05 12:51:28 【问题描述】:我是 ios 新手。我正在尝试使用 Segue 更改导航控制器中的过渡动画以从底部到顶部加载新的 UIView 控制器。我相信实施起来不会太难,但可能我无法理解。
我在其他帖子中找不到任何解决方案。
这是我一直在尝试的代码:-
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:@"alarmSegue"])
tab2ViewController *destViewController = segue.destinationViewController;
UIView *destView = destViewController.view;
destViewController.selectionName = @"alarms";
[sender setEnabled:NO];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView animateWithDuration:0.0
delay:0.0
options: UIViewAnimationOptionCurveLinear
animations:^
[destView setTransform:CGAffineTransformMakeTranslation(0, -1000)];
//[destView setFrame:CGRectMake(0, 440, 400, 45)];
//destView.frame = CGRectMake(0, 0, 320, 460);
completion:^(BOOL finished)
[sender setEnabled:YES];
];
[UIView commitAnimations];
我只想使用 Segue 实现从底部到顶部的简单过渡。我也想设置目标控制器的一些属性。
【问题讨论】:
【参考方案1】:将[UIView beginAnimations:nil context:nil];
和[UIView commitAnimations];
之间的代码(也包括这两行)替换为以下内容:
CGAffineTransform baseTransform = destView.transform; //1
destView.transform = CGAffineTransformTranslate(baseT,0,destView.bounds.size.height); //2
[UIView animateWithDuration: 0.5 animations:^
destView.transform = baseTransform; //3
];
-
引用原始转换。
在没有动画的情况下将我们的视图向下推,以便我们可以对其进行动画处理
将原始变换设置回视图。这一次,它会动起来
您可以进一步将延迟、选项和完成参数添加到该 UIView 动画方法。 Xcode 可能会帮助您完成这些自动完成。
【讨论】:
【参考方案2】:嗯,你快到了。
你主要需要改变两件事:
1 改变视图的初始位置。您希望视图从下到上显示,因此最初您的视图应该位于底部。这段代码应该写在动画之前。
[destView setTransform:CGAffineTransformMakeTranslation(0, -1000)];
2 然后你需要从底部滑动到原来的位置,因此在动画块内:
[destView setTransform:CGAffineTransformMakeTranslation(0, 0)];
还有一个建议,我猜你使用的是更新版本的iOS(iOS4以上)而不是使用动画块使用UIView的动画方法
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
更多信息,请参考description。
编辑:
根据您对问题的编辑,您希望使用情节提要在应用程序中更改 NavigationController 的过渡动画。为此,您可以使用自定义 Segue。你必须创建一个自定义的 segue,一个继承 UIStorySegue 的类并覆盖它的 perform
方法,如下所示:
-(void)perform
//UIViewAnimationOptions options;
UIViewController *sourceViewController = (UIViewController*)[self sourceViewController];
UIViewController *destinationController = (UIViewController*)[self destinationViewController];
CATransition* transition = [CATransition animation];
transition.duration = 0.9f;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade
transition.subtype = kCATransitionFromTop; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom
[destinationController.view.layer addAnimation:transition forKey:kCATransition];
[sourceViewController presentViewController:destinationController animated:NO completion:nil];
您还必须在情节提要中将 segue 类更改为此自定义 segue,以使其正常工作。
【讨论】:
是的,我试过 [destView setTransform:CGAffineTransformMakeTranslation(0, 0)];然后第一行第二个参数是-1500。它可以工作,但是在我们的动画中,从右到左的默认动画是可见的。我们能阻止它吗? 动画完成后,没有进行segue,因此没有接收到目标控制器所需的属性。如何使用动画执行 segue? 您在使用导航控制器吗?如果是,那么你问的是一个错误的问题。然后,您应该寻找如何在导航控制器中更改过渡动画。如果您将视图作为子视图添加到另一个视图上,我粘贴的解决方案会更有用 哦对了!那我换个问题吧。既然您已经知道我一直在努力实现的目标,那么您能帮我解决这个问题吗?【参考方案3】:尝试使用transition effects
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:@"alarmSegue"])
CATransition transition = [CATransition animation];
transition.duration = 0.5;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = direction;
[self.view.layer addAnimation:transition forKey:kCATransition];
tab2ViewController *destViewController = segue.destinationViewController;
UIView *destView = destViewController.view;
destViewController.selectionName = @"alarms";
[sender setEnabled:NO];
【讨论】:
我正在尝试。你能告诉我transition.subtype中的“方向”是什么吗? 把它写成字符串@"left"
或@"top"
谢谢!我得到了它。但我正在尝试打开一个新视图,该视图将从下到上进行动画处理,一个简单的动画,如默认(从右到左)。
@NirajBurde 不会以类似方式打开新视图
它在离开屏幕时动画当前视图的过渡以上是关于如何在导航控制器中将过渡动画从底部更改为顶部?的主要内容,如果未能解决你的问题,请参考以下文章
在swift中将navigationBar底部边框更改为虚线