iOS:视图控制器之间的动画
Posted
技术标签:
【中文标题】iOS:视图控制器之间的动画【英文标题】:iOS: animation between view controllers 【发布时间】:2013-07-04 23:10:08 【问题描述】:我在任何地方都找不到这个。所以,如果你有这方面的信息,请给我一个链接。
我有一个视图控制器,我为一个简单的游戏制作了一个菜单。上面有一些按钮。 我有另一个视图控制器,还有一些按钮。
问题是: “在我选择一个触发自定义segue(没有任何动画)到另一个视图控制器的按钮后,我如何制作这个按钮的动画(隐藏屏幕),另一个视图控制器将运行它的按钮动画(从边框进入屏幕)屏幕)?”
我是这样设计的:
1) 理论:我为菜单按钮制作了一个 IBAction,然后在这个 IBAction 中我调用了一个动画方法,它调用了一个 performSegueMethod:。之后在新的 VC 中的 viewWillAppear 方法中调用一个动画方法(即来自源 VC 的几乎相等的方法)。所有这些都有效,但这看起来并不顺利。当目标 VC 替换源 VC 时,会出现此动画的问题。有一些瞬间,当一切看起来都是静止的,并且只有在这个动画开始之后。 我不知道如何消除这个目标 VC 滞后。可能我必须在 segue 之前加载目标视图?我试图这样做,但可能是做错了什么,或者它只是不帮助我。
2) 练习:
firstViewController.m:
- (IBAction)newGameSegueButton
[self menuSlideInDirection:@"CenterToLeft" performingSegueWithIdentifier:@"mode"];
-(void)menuSlideInDirection:(NSString *)direction performingSegueWithIdentifier:(NSString *)segueIdentifier
[UIView animateWithDuration:0.4 animations:^
CGPoint newGameButtonCenter;
newGameButtonCenter.x = directionIndex * 160;
newGameButtonCenter.y = self.gameButtonSlide.center.y;
self.gameButtonSlide.center = newGameButtonCenter;
[UIView animateWithDuration:0.3 delay:0.1 options:UIViewAnimationOptionBeginFromCurrentState animations:^
//some animation too
completion:nil];
[UIView animateWithDuration:0.2 delay:0.2 options:UIViewAnimationOptionBeginFromCurrentState animations:^
//animation
completion:nil];
[UIView animateWithDuration:0.1 delay:0.3 options:UIViewAnimationOptionBeginFromCurrentState animations:^
//some animation too
completion:^(BOOL finished)
if(segueIdentifier)
[self performSegueWithIdentifier:segueIdentifier sender:self];
];
];
好的,那么自定义 segue 代码就很简单了:
-(void)perform
UIViewController *src = self.sourceViewController;
UIViewController *dst = self.destinationViewController;
[src.navigationController pushViewController:dst animated:NO];
还有我的 secondViewController.m:
-(void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
[self menuSlideInDirection:@"RightToCenter" performingSegueWithIdentifier:nil];
menuSlideInDirection:@"RightToCenter" 在 secondViewController 中执行SegueWithIdentifier:nil 与 firstView 中具有相同名称的方法相同。
我正在寻找目标视图控制器的特定对象在转场之后的流畅动画。
可能是做错了,还有另一种方法吗? (我只想将目标 VC 的所有视图和所有控件添加到源 VC 并完全删除“目标 VC”)。
希望有人能帮我解决这个问题。
【问题讨论】:
你正在对新的视图控制器进行什么转场转换? 嗯,我想我不使用任何 segue 过渡,正如您在我的 perform 方法中看到的那样。我没听错吧? 你打电话给performSegueWithIdentifier:
。这是一个推动,模态?它是一种什么样的segue?再说一次,这可能无关紧要。我只是好奇而已。您是正确的,将两个视图放在同一个 VC 下将使整个过程在您的控制之下,并使您能够确保它是顺利的。否则,您可以按照 Roshan 的建议进行破解。
@MattMc 我使用自定义 segue,嗯,我不知道,老实说,是 push 还是模态。我发布了一个自定义的 segue 类执行方法。我认为,实际上它是一个 push segue。
【参考方案1】:
尝试在perform
方法中制作所有第一个视图控制器的动画。
至于第二个视图控制器的动画,我认为除了在viewWillAppear
(尽管我更喜欢viewDidAppear
)中做它之外,没有任何其他“好”方法,因为目标视图控制器的出口不是在执行 segue 时设置(它们将为零)。换句话说,您无法访问按钮,更不用说为它们设置动画了。
一种骇人听闻的方法是在perform
之前调用[segue.destinationViewController view]
,以便加载目标视图控制器的视图层次结构并设置出口。然后,也许,您可以在将目标视图控制器中的 perform
中的按钮推送到导航堆栈之前对其进行动画处理。
【讨论】:
如果我在自定义 segue 类中没有此按钮的出口,如何在perform
方法中完成所有第一个 VC 动画?
“hackish 方式”和目标 VC 网点的相同问题
我说得对吗,[segue.destinationViewController view]
我必须添加以准备转场?
忘了说,这一切都不起作用,正如我想要的那样:(在代码更改之后没有明显的变化。【参考方案2】:
对于我的问题,我选择将两个视图放在同一个VC下的方式。动画很流畅,看起来比使用 perform / viewWillAppear 方法好多了。
【讨论】:
以上是关于iOS:视图控制器之间的动画的主要内容,如果未能解决你的问题,请参考以下文章