8

Я использую следующий код в качестве расширения UINavigationController нажать контроллер с пользовательской анимацией вида:толкая UITableViewController с пользовательской анимацией всегда воодушевляешь UINavigationItem Название

@implementation UINavigationController (PushAnimation) 

- (void)pushViewController:(UIViewController*)controller withTransition:(UIViewAnimationTransition)transition 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [self pushViewController:controller animated:NO]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationBeginsFromCurrentState:YES];   
    [UIView setAnimationTransition:transition forView:self.view cache:YES]; 
    [UIView commitAnimations]; 
} 

@end 

С включенным кэшированием, я получаю странное поведение анимации при нажатии UITableViewController. Заголовок продвинутого представления появляется после завершения пользовательской анимации. С переходным стилем UIViewAnimationTransitionNone становится ясно, что сам заголовок анимирован. Он перемещается из верхнего левого угла экрана в центр UINavigationBar.

С отключенным кэшированием эта анимация не видна из-за ее скорости, но частота кадров значительно падает.

Как я могу предотвратить анимацию заголовка?

+1

Я думаю, что анимация названия происходит в коде 'UINavigationBar'. Идея заключалась бы в подклассе, который также изменил бы поведение по умолчанию – adig

ответ

0

Просто быстро обновите мое исправление в конце. Невозможно переопределить поведение по умолчанию UINavigationBar, поскольку iOS использует частный API для реализации анимации. Так что я в конечном итоге удаление всех анимаций на UINavigationBar и различных его подвидов, используя следующий код:

[self.navigationBar.layer removeAllAnimations]; 
for (UIView *view in self.navigationBar.subviews) { 
    [view.layer removeAllAnimations]; 
    for (UIView *sub in view.subviews) { 
     [sub.layer removeAllAnimations]; 
    } 
} 

Важно, что это называется после [self pushViewController:controller animated:NO];.

0

Вопрос: вы - анимированный весь вид self.view. self.view содержит контроллер вида, а также UINavigationBar. Поэтому вам, вероятно, придется получить все подзаголовки self.view, а затем оживить только view, относящихся к вашему контроллеру.

+0

Ну, я тоже хочу анимировать панель навигации, так как я хочу, чтобы весь экран изменился, а не только содержимое ниже UINavigationBar. Проблема в том, что я, похоже, не могу отключить навигацию по умолчанию для UINavigationbar. –

0

Используйте этот код для настройки навигации анимации перехода в очень простой способ:

CATransition* transition = [CATransition animation]; 
transition.duration = 0.5; 
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
transition.type = kCATransitionMoveIn; //kCATransitionPush; //kCATransitionReveal; //kCATransitionFade; 
//transition.subtype = kCATransitionFromRight; //transition.subtype = kCATransitionFromLeft; //transition.subtype = kCATransitionFromTop; //transition.subtype = kCATransitionFromBottom; 
transition.subtype = kCATransitionFromRight; 
[self.navigationController.view.layer addAnimation:transition forKey:nil]; 
[[self navigationController] popViewControllerAnimated:NO]; 

и то же самое для толчка.

** Убедитесь, что #import <QuartzCore/QuartzCore.h> в своем классе, а также добавить рамки для вашего проекта

цель> Build Phases> Link Binary С Библиотеки> кнопка "+"> QuartzCore.framework

.

Смежные вопросы