2009-03-14 3 views
4

Я в основном пытаюсь дублировать поведение iPod-приложения на iPhone, где, когда вы выбираете песню, открывается музыкальный проигрыватель, а панель навигации переходит на новый цвет.Переход цвета UINavigationBar?

Мое приложение настроено как приложение на основе вкладок, с UITabBarController и вложенным UINavigationController на каждой вкладке. Внутри каждого UINavigationController для каждой вкладки находится UITableView. Когда я выбираю элемент в таблице, я использую pushViewController, чтобы перейти к следующему виду, и я установил hidesBottomBarWhenPushed в следующем контроллере представления, чтобы сдвинуть вкладки. Поведение очень близко к странице iPod «Now Playing», которая почти идеальна.

Последняя проблема заключается в том, что я не могу изменить цвет панели навигации, например, как панель навигации в приложении iPod исчезает от синего до черного. Я могу заставить изменение цвета после появления нового представления (в viewWillAppear), но изменение является резким и не имитирует поведение iPod-приложения с эффектом затухания.

Кто-нибудь знает, что мне здесь не хватает? Это кажется очень простым и распространенным пользовательским интерфейсом, который я видел в нескольких приложениях, но, похоже, не существует очевидного способа сделать это.

ответ

3

Вы можете анимировать изменение стиля строки состояния, чтобы создать эффект, который довольно близок.

- (void)viewWillAppear:(BOOL)animated { 
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:animated]; 
    self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque; 
} 

Как вы уже заметили, стиль панели навигации сразу меняется, но анимированные изменения в строку состояния по-прежнему обеспечивают общий вид перехода.

+0

Это то, что я на самом деле произошло с , и эффект удовлетворительный. –

+4

Спасибо. Только комментарий, помните, если вы переопределите 'viewWillAppear', вы должны назвать super в какой-то момент своей реализации. – petert

2

Я приготовил решение, которое может быть больше того, что вы ищете.

  • Создайте собственный подкласс UINavigationBar.
  • Override setBarStyle: следующим

код:

- (void)setBarStyle:(UIBarStyle)style { 
    //Fade our content, ie background, from one style to another 
    CATransition *transition = [[CATransition new] autorelease]; 
    transition.type = kCATransitionFade; 
    transition.duration = 0.2; 
    [self.layer addAnimation:transition forKey:@"content"]; 

    [super setBarStyle:style]; 
} 
  • Настройка контроллеров нав использовать этот подкласс
    • В IB, вы можете просто установить класс в инспекторе
9

ответ Эндрю на самом деле работает довольно хорошо, но я хотел бы добавить две вещи, чтобы сделать его работу лучше:

  1. Выполняют функции через категорию вместо подклассов. Много, гораздо менее беспорядочно.
  2. Используйте только переход, когда это абсолютно необходимо. Причиной этого является то, что при использовании этого метода исходный текст заголовка просто исчезает, а не соскальзывает сбоку. Это тонкий, но гораздо более заметный, если это происходит во время перехода, когда стиль бара фактически не меняется. Поэтому я избегаю этого.

Вот моя категория кода (я его в категориях как UINavigationBar и UIToolbar):

- (void)setBarStyle:(UIBarStyle)barStyle animated:(BOOL)animated { 
    if (animated && self.barStyle != barStyle) { 
     CATransition *transition = [CATransition animation]; 
     transition.duration = 0.2; 
     transition.timingFunction = [CAMediaTimingFunction 
      functionWithName:kCAMediaTimingFunctionEaseIn]; 
     [self.layer addAnimation:transition forKey:nil]; 
    } 

    [self setBarStyle:barStyle]; 
} 

И это, как я использую его:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    [[UIApplication sharedApplication] 
     setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES]; 
    [self.navigationController.navigationBar 
     setBarStyle:UIBarStyleBlackTranslucent animated:YES]; 
    [self.navigationController.toolbar 
     setBarStyle:UIBarStyleBlackTranslucent animated:YES]; 
}