Пользовательский UINavigationController UINavigationBar

В основном я хочу пользовательский UINavigationBar. Я не хочу, чтобы оно было «прозрачным» или что-то в этом роде, как приложение с картинками.

Я в основном хочу полностью удалить его, но я все еще хочу иметь возможность добавлять кнопки «Назад» и тому подобное, когда нажимаются контроллеры навигации, и я хочу, чтобы представления (например: UITableViewController) опускались ниже него.

Нравится:

альтернативный текст

Любые идеи, как добиться этого вообще?

Спасибо


person Thomas Clayson    schedule 28.10.2010    source источник


Ответы (4)


@implementation UINavigationBar (background)

- (void)drawRect:(CGRect)rect {
    UIImage *image = [UIImage imageNamed:@"navigationbar.png"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

@end

в основном, это не полностью видно - это визуальная ложь. Единственный реальный способ сделать это — переопределить метод drawRect: UINavigationBar, как показано выше.

person Thomas Clayson    schedule 28.10.2010
comment
Считается плохой практикой переопределять методы из категории. - person Justin; 11.05.2011
comment
эээ... есть ли другой способ сделать это, мистер Джастин? - person Thomas Clayson; 11.05.2011
comment
Извините, я должен был предложить эту альтернативу вместо того, чтобы просто критиковать старый пост: вы можете переопределить drawRect: в подходящем подклассе UINavigationBar, а затем установить его как класс панели навигации вашего UINavigationController. Однако единственный официальный способ установить этот класс — через XIB. - person Justin; 11.05.2011
comment
Ах, достаточно справедливо. Невозможно программно изменить класс панели навигации UINavigationController? - person Thomas Clayson; 13.05.2011
comment
Не через официальные API, нет, но существуют обходные пути. - person Justin; 13.05.2011

Чтобы видеть сквозь UINavigationBar, если вы решите его иметь, просто:

self.navigationController.navigationBar.translucent=YES;

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

person Jordan    schedule 28.10.2010
comment
Это просто делает его полупрозрачным... все в порядке, я нашел другой способ сделать это... см. мой ответ - person Thomas Clayson; 28.10.2010

В начале вашего AppDelegate подкласса UINavigationBar, как показано ниже:

@interface CustomNavBar : UINavigationBar

@end

@implementation CustomNavBar

- (void)drawRect:(CGRect)rect {
    UIImage *image = [UIImage imageNamed:@"bar.png"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

а затем в AppDelegate сделайте это волшебство:

//Set custom NavigationBar
[self.navController setValue:[[CustomNavBar alloc]init] forKeyPath:@"navigationBar"];
//Set tint to match bar.png
self.navController.navigationBar.tintColor = [UIColor colorWithRed:0.93 green:0.43 blue:0 alpha:1];
//Set font for NavigationBar
[self.navController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"Comfortaa-Bold" size:20], UITextAttributeFont, nil]];

Это должно дать вам больше контроля над внешним видом UINavigationController.

person sqreept    schedule 24.08.2012

Трудно сказать, может быть UINavigationBar есть и цвет соответствует фону UIView или UINavigationBar нет, просто вид с пользовательскими кнопками и UILabel сверху. Выберите подход и закодируйте его или задайте вопрос еще раз, уточнив его.

person Jordan    schedule 28.10.2010
comment
Я не знаю, как указать больше. Я хочу прозрачную панель навигации. Мне просто нужно создать свой собственный элемент стиля панели навигации? В таком случае, как мне узнать, что я нахожусь на контроллере корневого представления? Если я не нахожусь на контроллере корневого представления, я могу просто добавить кнопку «Назад» в представление, не так ли? - person Thomas Clayson; 28.10.2010