Three20 TTLauncher动画/转换

Three20 TTLauncher动画/转换

问题描述:

我目前使用Three20 TTLauncher作为我的应用程序的基础。Three20 TTLauncher动画/转换

但是,当点击TTLaunchItem时,它会跳转到映射的URL。

有什么办法可以使用Facebook应用程序使用的相同“扩展”动画/转换?

我假设你是这样打开你的网址在您的TTLauncherView:

- (void)launcherView:(TTLauncherView*)launcher didSelectItem:(TTLauncherItem*)item 
{ 
    [[TTNavigator navigator] openURLAction:[[TTURLAction actionWithURLPath:item.URL] applyAnimated:YES]]; 
} 

打开的网址与你的动画视图,然后打开类似下面的URL动画。

首先你需要一个新的变量来保存你的URL。转到您的LauncherView.h文件并定义一个新的NSString *_urlToOpen;

回到您的.m文件中,我们需要2种其他方法。一个用于动画部分(只是将视图动画)和另一个动画完成后调用。

我先发布动画代码,稍后再解释。

-(void)animateTransition:(NSNumber *)duration { 
    self.view.userInteractionEnabled=NO; 
    viewController = [[[TTNavigator navigator] viewControllerForURL:_urlToOpen] retain]; 
    [[self view] addSubview:viewController.view]; 
    viewController.view.frame=[[UIScreen mainScreen] bounds]; 
    viewController.view.transform=CGAffineTransformMakeScale(0.01, 0.01); 
    viewController.view.hidden=false; 

    [UIView beginAnimations:@"animationExpand" context:NULL]; 
    [UIView setAnimationDuration:[duration floatValue]]; 
    viewController.view.transform=CGAffineTransformMakeScale(1, 1); 

    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 
    [UIView commitAnimations]; 
} 

首先,我们将userInteractionEnabled设置为NO,以便用户在动画运行时无法点击任何按钮。然后我们得到我们想从TTNavigator打开动画的viewController并将其添加到实际视图(Launcher视图)中。 将我们新视图的框架定义为屏幕边界,并在屏幕中间将其缩小到非常小的尺寸。现在我们设置动画以将视图缩放到原始大小(屏幕边界),并使用DidStopSelector启动动画。

的DidStopSelector看起来像这样:

-(void)animationDidStop:(NSString *)animationID finished:(BOOL)finished context:(void *)context{ 
    self.view.userInteractionEnabled=YES; 
    viewController.view.hidden=true; 
    [viewController.view removeFromSuperview]; 
    [viewController release]; 
    [[TTNavigator navigator] openURLAction:[[TTURLAction actionWithURLPath:_urlToOpen] applyAnimated:NO]]; 
} 

第一行是不言自明的。然后,我们只从超级视图中移除视图并打开我们的URL,但没有任何过渡动画。

最后编辑您的- (void)launcherView:(TTLauncherView*)launcher didSelectItem:(TTLauncherItem*)item方法将URL保存到您的新变量中,并调用animateTransition方法。

- (void)launcherView:(TTLauncherView*)launcher didSelectItem:(TTLauncherItem*)item 
{ 
    _urlToOpen = [NSString stringWithString:item.URL]; 
    [self performSelector:@selector(animateTransition:) withObject:[NSNumber numberWithFloat: 0.60f]]; 
} 

在其他方向相同的工作,但你必须要关心,如果你的用户点击导航栏上的后退按钮会发生什么。正常行为是使用标准幻灯片动画制作动画。

此答案基于Three20 Google Groups上的论坛主题。找到它here

+0

这是完美的我所需要的!非常感谢! –

+0

嗨好吧,永远的摆弄后,我似乎无法拦截后退按钮...我用这个,但它没有打电话。'UIBarButtonItem * newBackButton = [[UIBarButtonItem alloc] initWithTitle:@“Back”style:UIBarButtonItemStyleBordered target:launcherView action:@selector(shrinkAnimation)]; [[self navigation item] setBackBarButtonItem:newBackButton];' –

+0

在我的情况下(使用Three20基于URL的导航),自动出现后栏按钮。新的视图控制器被推到导航堆栈上,因此后退按钮出现。所以我不需要自己做。我不知道你是否可以编辑选择器,当你点击后退按钮时会被调用。 – audience

我不得不在我的一个项目中编写类似的东西。

https://github.com/aporat/TTLauncherView_ExpandViewTransitions

此示例项目还包括收缩效应将发射视图时回& Facebook的发射后退按钮