Three20 TTLauncher Анимации / Переходы - PullRequest
2 голосов
/ 27 июля 2011

В настоящее время я использую Three20 TTLauncher в качестве основы для моего приложения.

Однако при нажатии на TTLaunchItem он переходит на сопоставленный URL.

Есть ли способ использовать ту же "расширяющуюся" анимацию / переход, которую использует приложение facebook?

Ответы [ 2 ]

4 голосов
/ 28 июля 2011

Я предполагаю, что вы открываете свой URL в вашем TTLauncherView следующим образом:

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

Чтобы открыть URL с анимацией, вы должны анимировать представление, а затем открыть 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, чтобы пользователь не мог нажимать какие-либо кнопки во время анимации. Затем мы получаем viewController, который мы хотим открыть анимированно из TTNavigator, и добавляем его в фактическое представление (представление запуска). Определите рамку нашего нового вида для границ экрана и уменьшите его до очень маленького размера в середине экрана. Теперь мы настроим анимацию для масштабирования вида до его исходного размера (границы экрана) и запустим анимацию с помощью 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. Найдите его здесь .

1 голос
/ 29 июля 2011

Мне пришлось написать нечто подобное в одном из моих проектов.

См. https://github.com/aporat/TTLauncherView_ExpandViewTransitions

Этот пример проекта также включает эффект сжатия при возврате к представлению средства запуска и кнопку возврата средства запуска Facebook *

...