2016-04-01 3 views
-1

Я делаю пользовательскую навигациюBar с цветом фона и размером шрифта. Кроме того, у меня есть кнопка меню справа. Для этого я сделал категорию под названиеммногоразовый UIBarButtonItem во всех контроллерах просмотра в Objective C

UINavigationController + Transparent.h

@interface UINavigationController (Transparent) 
    - (void)presentTransparentNavigationBar; 
    - (void)hideTransparentNavigationBar; 
@end 

UINavigationController + Transparent.m

#import "UINavigationController+Transparent.h" 

@implementation UINavigationController (Transparent) 

UIBarButtonItem *menuButton; 

- (void)presentTransparentNavigationBar; 
{ 
menuButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"menu_icon"] style:UIBarButtonItemStylePlain target:self action:@selector(showMenu:)]; 

    [menuButton setTintColor:[UIColor whiteColor]]; 

    self.navigationItem.rightBarButtonItem = menuButton; 


UIImage *backButtonImage = [UIImage imageNamed:@"back"]; 
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom]; 

[backButton setImage:backButtonImage 
      forState:UIControlStateNormal]; 

backButton.frame = CGRectMake(0, 0, backButtonImage.size.width, backButtonImage.size.height); 

[backButton addTarget:self 
       action:@selector(popViewController) 
    forControlEvents:UIControlEventTouchUpInside]; 

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 
self.navigationItem.leftBarButtonItem = backBarButtonItem; 


    [self.navigationBar setTranslucent:NO]; 
    [self.navigationBar setShadowImage:[UIImage new]]; 
    [self.navigationBar setBarTintColor:[UIColor wolfRed]]; 
    [self.navigationBar setTitleTextAttributes: 
     @{NSForegroundColorAttributeName:[UIColor whiteColor], NSFontAttributeName:[UIFont fontWithName:@"Helvetica" size:19.0] }]; 
    [self setNavigationBarHidden:NO animated:NO]; 
} 


- (void)hideTransparentNavigationBar 
{ 
    [self setNavigationBarHidden:YES animated:NO]; 
    [self.navigationBar setBackgroundImage:[[UINavigationBar appearance] backgroundImageForBarMetrics:UIBarMetricsDefault] forBarMetrics:UIBarMetricsDefault]; 
    [self.navigationBar setTranslucent:[[UINavigationBar appearance] isTranslucent]]; 
    [self.navigationBar setShadowImage:[[UINavigationBar appearance] shadowImage]]; 
} 
@end 

в моих ViewControllers я называю

[self.navigationController presentTransparentNavigationBar]; 

или

[self.navigationController hideTransparentNavigationBar]; 

Проблема в том, что кнопка меню не видна, а кнопка возврата выглядит как стандартная кнопка синего цвета iOS. Спасибо за помощь!

ответ

0

См я настроить свою навигационную панель в следующим образом с Objective C

Шаг 1. Убедитесь, что контроллер View встраивать в навигации контроллер

enter image description here

Шаг .2 Добавьте необходимые значки в свои активы, например. «menu_icon» и «back»

Шаг 3 с целью-C вы можете настроить панель навигации так, как хотите.

Я всегда делаю так,

#import "ViewController.h" 
@interface ViewController(){UIBarButtonItem *menuButton;} 
@end 


@implementation ViewController 

#pragma mark - life cycle methods 
- (void)viewDidLoad {[super viewDidLoad];} 
- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];} 

#pragma mark - IBAction methods 
- (IBAction)showClicked:(id)sender {[self presentTransparentNavigationBar];} 
- (IBAction)hideClicked:(id)sender {[self hideTransparentNavigationBar];} 

#pragma mark - Navigation Bar methods 

//Customize Naviagtion Bar 
- (void)presentTransparentNavigationBar; 
{ 
    //Add Menu Button to Navigaiton Bar 
    menuButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"menu_icon"] style:UIBarButtonItemStylePlain target:self action:@selector(showMenu:)]; 
    [menuButton setTintColor:[UIColor whiteColor]]; 
    self.navigationItem.rightBarButtonItem = menuButton; 


    //Add Back button to Navigation Bar 
    UIImage *backButtonImage = [UIImage imageNamed:@"back"]; 
    UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [backButton setImage:backButtonImage 
       forState:UIControlStateNormal]; 
    backButton.frame = CGRectMake(0, 0, backButtonImage.size.width, backButtonImage.size.height); 
    [backButton addTarget:self 
        action:@selector(popViewController) 
     forControlEvents:UIControlEventTouchUpInside]; 
    UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 
    self.navigationItem.leftBarButtonItem = backBarButtonItem; 

    //Config Navigaton bar settings 
    [self.navigationController.navigationBar setTranslucent:NO]; 
    [self.navigationController.navigationBar setShadowImage:[UIImage new]]; 
    [self.navigationController.navigationBar setBarTintColor:[UIColor lightGrayColor]];//I used light gray color 
    [self.navigationController.navigationBar setTitleTextAttributes: 
    @{NSForegroundColorAttributeName:[UIColor whiteColor], NSFontAttributeName:[UIFont fontWithName:@"Helvetica" size:19.0] }]; 
    [self.navigationController.navigationBar setHidden:NO]; 
} 


//Hide Navigation Bar 
- (void)hideTransparentNavigationBar 
{ 
    [self.navigationController.navigationBar setHidden:YES]; 
    [self.navigationController.navigationBar setBackgroundImage:[[UINavigationBar appearance] backgroundImageForBarMetrics:UIBarMetricsDefault] forBarMetrics:UIBarMetricsDefault]; 
    [self.navigationController.navigationBar setTranslucent:[[UINavigationBar appearance] isTranslucent]]; 
    [self.navigationController.navigationBar setShadowImage:[[UINavigationBar appearance] shadowImage]]; 
} 

- (void) showMenu:(id) sender{ /*TODO when clicks on Menu button */ } 
- (void) popViewController{ /*TODO when clicks on Back button */ } 

@end 

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

enter image description here

Примечание:

вы можете сделать это в вашем файле AppDelegate так будет доступен во всем приложении

+0

это очень хороший ответ! Но как я могу использовать одну и ту же кнопку меню на каждом ViewController без копирования кода во всех представлениях? –

+0

спасибо !! вам нужно использовать ту же логику в вашем методе AppDelegate didFinishLaunchingWithOptions – swiftBoy

+0

Может ли инициализировать UINavigationViewController без определения rootviewController в appdelegate? –

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