Я пытался настроить внешний вид заголовка панели навигации в своем приложении.

Мне пришлось создать пользовательский контроллер навигации (не только для этой проблемы), поэтому я решил переопределить функцию setTitle, подобную этой.

- (void)setTitle:(NSString *)title
{
    NSLog(@"SETTING TITLE %@", title);
   [super setTitle:title];
   UILabel *titleView = (UILabel *)self.navigationBar.topItem.titleView;
   NSLog(@"title view is %@", titleView);
    if (!titleView) {
        titleView = [[UILabel alloc] initWithFrame:CGRectZero];
        titleView.backgroundColor = [UIColor clearColor];
        titleView.font = [UIFont fontWithName:@"TradeGothicLTStd-Bold-Accent-Accent" size:20];
        titleView.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.5];
        titleView.textColor = [UIColor whiteColor];
        self.navigationBar.topItem.titleView = titleView;
        [titleView release];
    }
    titleView.text = [title uppercaseString];
    [titleView sizeToFit];

    self.navigationBar.tintColor= [UIColor colorWithRed:130.0f/255.0f green:120.0f/255.0f blue:90.0f/255.0f alpha:1.0f];
}

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

Это код для didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NSString *category_id = [[managedObject valueForKey:@"category_id"] stringValue];
    NSString *name = [[[managedObject valueForKey:@"name"] description] capitalizedString];
    CategoryViewController *category = [[CategoryViewController alloc] initWithNibName:@"CategoryViewController" bundle:nil];
    category.category_id = category_id;
    category.name = name;
    category.managedObjectContext = self.managedObjectContext;
    // ...
    // Pass the selected object to the new view controller.
    [self.navigationController pushViewController:category animated:YES];
    [category release];
}

.... но когда появляется выбранный вид, он отображается со стандартным шрифтом.

ИЗМЕНИТЬ Я заметил, что если во втором представлении я задаю заголовок в методе viewDidAppear, происходит что-то другое. если я напишу

- (void)viewDidAppear:(BOOL)animated
{
self.navigationController.title = name;
[super viewDidAppear:animated];
}

... заголовок на панели навигации имеет правильный (пользовательский) шрифт, но заголовок появляется только после того, как вид закончил скользить ....? Опять же, я явно делаю что-то не так, любая помощь будет оценена по достоинству :)

Спасибо за ваше время!

5
Sr.Richie 17 Ноя 2011 в 15:48

4 ответа

Фрагмент кода

[[UINavigationBar appearance] setTintColor:[UIColor colorWithRed:107.0/256.0 green:145.0/256.0 blue:35.0/256.0 alpha:1.0]]; 

Изменит цвет панели навигации всего приложения.

Просто поместите его в метод didFinishLauncing приложения Appdelegate.

8
Peter O. 2 Ноя 2012 в 15:36

Начиная с iOS 5 вы можете сделать это напрямую с помощью UINavigationBar.

https://developer.apple.com/library/ios/# документация/UIKit/Reference/UINavigationBar_Class/Reference/UINavigationBar.html Настройка внешнего вида панели навигации

Просто установите словарь titleTextAttributes

7
Mathieu Hausherr 17 Ноя 2011 в 16:36
Спасибо за ответ, но приложение должно быть совместимо с 4.0 :(
 – 
Sr.Richie
17 Ноя 2011 в 16:38
Итак, посмотрите на этот пост stackoverflow.com/questions /599405/… :-)
 – 
Mathieu Hausherr
17 Ноя 2011 в 16:43
Еще раз спасибо, я видел этот пост, вы можете обнаружить, что я на самом деле прокомментировал ответ, и часть кода, который я написал здесь, взята оттуда :) Что меня действительно озадачивает, так это то, что Эрик Б. сказал мне: «Вы должны поместить это на всеобщее обозрение». контроллеры, где вам нужно изменить цвет заголовка». Но почему код в моем пользовательском классе навигации не запускается правильно? Я нуб в Objective-C :(
 – 
Sr.Richie
17 Ноя 2011 в 16:52

Для iOS7 и более поздних версий решение таково:

[UINavigationBar appearance].barTintColor = [UIColor redColor];

Вставьте этот код в метод AppDelegate (didFinishLaunching:), и все должно работать нормально.

0
vyudi 29 Авг 2014 в 03:53

Вместо того, чтобы устанавливать это в методе viewDidAppear, сделайте это в методе viewDidLoad.

-1
Ilanchezhian 17 Ноя 2011 в 16:36
Спасибо за ваш ответ, но если я установлю «self.navigationController.title = name» в методе viewDidLoad второго представления, при нажатии на строку заголовок изменится в первом представлении ДО того, как второе представление скользит в
 – 
Sr.Richie
17 Ноя 2011 в 16:41