Переходя UINavigationBar цветов? - PullRequest
4 голосов
/ 14 марта 2009

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 07 августа 2010

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

  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];
}
3 голосов
/ 20 марта 2009

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

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

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

2 голосов
/ 28 мая 2009

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

  • Создание пользовательского подкласса UINavigationBar.
  • Переопределить 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 вы можете просто установить класс в инспекторе
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...