私のアプリでは、カスタム UINavigationBar を作成し、タイトル画像、戻るボタン、サインオフ ボタンを含むナビゲーション バーのような UINavigationBar をカスタマイズするためのさまざまなメソッドを記述しました。現在のビューコントローラーに基づいてナビゲーションバーを変更する必要があります。
これが私の CustomUINavigationClass です
#import <UIKit/UIKit.h>
typedef enum {
simple = 1,
back,
signoff,
both
} NavBarChoices;
NavBarChoices optionSelect;
@interface CustomNavigationBar : UINavigationBar
{
UIBarButtonItem * menuButton;
UIButton * showEditButton;
}
- (id)initWithFrame:(CGRect)frame andOption:(NavBarChoices)choice;
@end
.m
#import "CustomNavigationBar.h"
@implementation CustomNavigationBar
- (id)initWithFrame:(CGRect)frame andOption:(NavBarChoices)choice
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"CustomNavigationBar"
owner:self
options:nil];
if ([arrayOfViews count] < 1){
return nil;
}
optionSelect = choice;
CustomNavigationBar *newView = [arrayOfViews objectAtIndex:0];
self = newView;
}
return self;
}
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
switch (optionSelect) {
case 1:
[self drawSimpleNavBar];
break;
case 2:
[self drawWithBackOnly];
break;
case 3:
[self drawWithSignOffOnly];
break;
case 4:
[self drawWithBackAndSignOff];
break;
default:
break;
}
}
-(void)drawSimpleNavBar {
self.tintColor = [UIColor whiteColor];
self.backgroundColor = [UIColor whiteColor];
UIImage *image = [UIImage imageNamed:@"title_logo.png"];
[image drawInRect:CGRectMake(100, 13, 104, 20)];
UIImage *menuImage = [UIImage imageNamed:@"menu_off.png"];
showEditButton = [UIButton buttonWithType:UIButtonTypeCustom];
showEditButton.bounds = CGRectMake(0, 0, menuImage.size.width, menuImage.size.height+10);
showEditButton.frame = CGRectMake(2, 10, menuImage.size.width, menuImage.size.height);
[showEditButton setImage:menuImage forState:UIControlStateNormal];
[showEditButton setImage:[UIImage imageNamed:@"menu_on.png"] forState:UIControlStateSelected];
[showEditButton addTarget:self action:@selector(showMenu) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:showEditButton];
}
-(void)drawWithBackOnly {
self.tintColor = [UIColor whiteColor];
self.backgroundColor = [UIColor whiteColor];
UIImage *image = [UIImage imageNamed:@"title_logo.png"];
[image drawInRect:CGRectMake(100, 13, 104, 20)];
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[backButton setTitle:@"Back" forState:UIControlStateNormal];
[backButton setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal];
backButton.frame = CGRectMake(0, 3, 80, 30);
backButton.titleLabel.font = [UIFont boldSystemFontOfSize:12];
[backButton sizeToFit];
[backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:backButton];
}
-(void)drawWithSignOffOnly {
}
-(void)drawWithBackAndSignOff {
}
-(void)showMenu {
NSLog(@"Clicked");
showEditButton.hidden = YES;
[showEditButton setImage:[UIImage imageNamed:@"menu_on.png"] forState:UIControlStateNormal];
}
@end
そして、私はこれを App Delegate のように呼び出しています:
navigationBar = [[CustomNavigationBar alloc]initWithFrame:CGRectMake(0, 0, 320, 44) andOption:simple];
UINavigationController * nav = [[UINavigationController alloc]initWithNavigationBarClass:[navigationBar class] toolbarClass:nil];
self.viewController = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
[nav setViewControllers:@[_viewController] animated:NO];
self.window.rootViewController = nav;
これで、クリック時に最初のビュー コントローラーにボタンができました。同じ NavigationController のナビゲーション バーを変更するために、CustomNavigationBar クラスに要求を送信する別のビュー コントローラーをプッシュしたいと考えています。
ガイドしてください。現在、新しいコントローラーのviewDidLoadメソッドを変更しようとしていますが、UINavigationControllerのNavigationBarプロパティが読み取り専用であるため、新しいナビゲーションバーをそれに割り当てることができないか、そうでなければ私はこのようなことをしたでしょう
CustomNavigationBar * navBar = [[CustomNavigationBar alloc]initWithFrame:CGRectMake(0, 0, 320, 44) andOption:2];
self.navigationController.navigationBar = navBar;
助けてください。
ありがとう、