开发笔记 导航控制器(一)

首先是无故事板模式下


一 创建一个导航控制器


1 创建一个viewcontrol   Test_OneViewController

@interface AppDelegate :UIResponder <UIApplicationDelegate>

{

    Test_OneViewController *test;

    UINavigationController *navigation;

 

}

@property (strong,nonatomic)UIWindow *window;

@property (strong,nonatomic)UINavigationController *navigation;

@end


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    self.window = [[UIWindowalloc]initWithFrame:[[UIScreenmainScreen]bounds]];

    self.window.backgroundColor = [UIColorwhiteColor];


   test = [[Test_OneViewController   alloc]init];

   navigation = [[UINavigationController  alloc]initWithRootViewController:test];

    [self.window   addSubview:navigation.view];


    [self.windowmakeKeyAndVisible];

    returnYES;

}

///

// Uses a horizontal slide transition. Has no effect if the view controller is already in the stack.

//推送到下一个视图

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; 

 // Returns the popped controller.

//返回上一个视图

- (UIViewController *)popViewControllerAnimated:(BOOL)animated;

// Pops view controllers until the one specified is on top. Returns the popped controllers.

返回一个指定的视图

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated

 // Pops until there's only a single view controller left on the stack. Returns the popped controllers.

//返回根视图

- ( NSArray  *)popToRootViewControllerAnimated:( BOOL )animated;

///

这时候我们们创建了一个导航控制器!在首页上我们会看见一个导航栏


二 在导航控制器上我们添加两个按钮   UIBarButtonItem

/*  

typedefNS_ENUM(NSInteger, UIBarButtonItemStyle) {

    UIBarButtonItemStylePlain,   // shows glow when pressed

    UIBarButtonItemStyleBordered,

    UIBarButtonItemStyleDone,

};




- (id)initWithImage:(UIImage *)image style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action;


- (id)initWithImage:(UIImage *)image landscapeImagePhone:(UIImage *)landscapeImagePhone style:(UIBarButtonItemStyle)style target:(id)target action:

(SEL)actionNS_AVAILABLE_IOS(5_0);// landscapeImagePhone will be used for the bar button image in landscape bars in UIUserInterfaceIdiomPhone only

- (id)initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action;

- (id)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:(id)target action:(SEL)action;

- (id)initWithCustomView:(UIView *)customView;



*/

.///  Test_OneViewController   //


通过  - (id)initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action 函数创建了两个UIBarButtonItem


    self.title =@"导航控制器";  //导航标题

    UIBarButtonItem *rightButton = [[UIBarButtonItem   alloc]initWithTitle:@"push"style:UIBarButtonItemStyleDone target:self  action:@selector(pushAction)];

    self.navigationItem.rightBarButtonItem = rightButton;

    

    UIBarButtonItem *leftButton = [[UIBarButtonItem   alloc]initWithTitle:@"mode"style:UIBarButtonItemStyleDone   target:self  action:@selector(modeAction)];

    self.navigationItem.leftBarButtonItem = leftButton;


// mode 方式推送到一个视图 这种情况通常用来选取数据,调用系统通讯录 设置 等  需要手动写取消返回

//typedef NS_ENUM(NSInteger, UIModalTransitionStyle) {

  //  UIModalTransitionStyleCoverVertical = 0,

   // UIModalTransitionStyleFlipHorizontal,

    //UIModalTransitionStyleCrossDissolve,

-(void)modeAction

{

    ModeViewController *mode = [[ModeViewController  alloc]init];

    mode.modalTransitionStyle =UIModalTransitionStyleFlipHorizontal; //设置翻转动画效果  

    //mode.modalPresentationStyleUIModalPresentationFormSheet; //显示外观动画

  [self  presentViewController:mode  animated:YES completion:nil];

    

}

//反回到上一个视图

-(void)dissMissModeAction

{

    [self   dismissViewControllerAnimated:YEScompletion:nil];

}



// push 常用的推送方式,推送成功后下个视图会出现back 返回按钮

-(void)pushAction

{

    PushViewController *push = [[PushViewControlleralloc]init];

    [self.navigationControllerpushViewController:pushanimated:YES ];

}


问题 一  但是现在发现 返回按钮是英文的  应该改成汉语



我们在 添加左右item 的地方添加个backButtonItem

在ios7中有可以取消字母提示 用系统的图标更简洁 只要把title 设置为空就ok了


   UIBarButtonItem *backButtonItem = [[UIBarButtonItemalloc]init];

    //backButtonItem.title = @"返回";

    backButtonItem.title = @"";

   self.navigationItem.backBarButtonItem = backButtonItem;



问题二  发现导航栏是透明的 并且不暂用像素

我们可以通过设置bool 值 来隐藏导航栏


我们可以设置 bool 值来改变 透明不透明

self.navigationController.navigationBar.translucent =NO;


问题 三 有时候我们在自定义导航栏时候不想显示系统的导航栏怎么办

 self.navigationController.navigationBarHidden =YES;


问题四      如何改变系统导航栏的颜色 和自定义标题

ios7 xcode5 环境下


UIColor *navigationBackColor = [UIColorcolorWithRed:82.0/255.0green:135.0/255.0blue:237.0/255.0alpha:1.0];

   // ios7 新增加的方法  在xcode 5 下 

  self.navigationController.navigationBar.barTintColor = navigationBackColor;

 // 这个方法可与改变字体的颜色

 self.navigationController.navigationBar.tintColor = navigationBackColor;


能改变字体的颜色

ios 6.1 xcode 4 环境下

UIColor *navigationBackColor = [UIColor colorWithRed:82.0/255.0 green:135.0/255.0 blue:237.0/255.0 alpha:1.0];

  self.navigationController.navigationBar.tintColor =navigationBackColor;


如何在ios6.1的 情况下需要自定义 title的

 

    UILabel *navigateTitleLabel = [[UILabelalloc]initWithFrame:CGRectMake(0,0,100,30)];

    navigateTitleLabel.font = [UIFontsystemFontOfSize:20.0];

    navigateTitleLabel.textColor = [UIColorblackColor];

    navigateTitleLabel.backgroundColor = [UIColorclearColor];

    navigateTitleLabel.textAlignment =NSTextAlignmentCenter;

    navigateTitleLabel.text = @"导航控制器";

    self.navigationItem.titleView = navigateTitleLabel;


// 用系统的item/

我么通过这个函数可以设置系统提供的Item

- (id)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:(id)target action:(SEL)action;


typedefNS_ENUM(NSInteger, UIBarButtonSystemItem) {

    UIBarButtonSystemItemDone,

    UIBarButtonSystemItemCancel,

    UIBarButtonSystemItemEdit,  

    UIBarButtonSystemItemSave,  

    UIBarButtonSystemItemAdd,

    UIBarButtonSystemItemFlexibleSpace,

    UIBarButtonSystemItemFixedSpace,

    UIBarButtonSystemItemCompose,

    UIBarButtonSystemItemReply,

    UIBarButtonSystemItemAction,

    UIBarButtonSystemItemOrganize,

    UIBarButtonSystemItemBookmarks,

    UIBarButtonSystemItemSearch,

    UIBarButtonSystemItemRefresh,

    UIBarButtonSystemItemStop,

    UIBarButtonSystemItemCamera,

    UIBarButtonSystemItemTrash,

    UIBarButtonSystemItemPlay,

    UIBarButtonSystemItemPause,

    UIBarButtonSystemItemRewind,

    UIBarButtonSystemItemFastForward,

我们可以先把导航左边的的Item 改成 UIBarButtonSystemItemSearch 一个搜索的图形


    UIBarButtonItem *leftButton = [[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemSearchtarget:selfaction:@selector(modeAction)];

    self.navigationItem.leftBarButtonItem = leftButton;


问题五 通过图片 改变back 按钮 

// ITEM 添加图片/

- (id)initWithImage:(UIImage *)image landscapeImagePhone:(UIImage *)landscapeImagePhone style:(UIBarButtonItemStyle)style target:(id)target action:


我在back 所在的视图类添加一下代码 就把按钮替换成自己定义的风格图形的按钮了 同理当然可以改变push 的item


   UIImage *imge = [UIImageimageNamed:@"导航_返回.png"];

    UIBarButtonItem *leftButton = [[UIBarButtonItemalloc]initWithImage:imgestyle:UIBarButtonItemStyleDonetarget:selfaction:@selector(pushActions)];

    self.navigationItem.leftBarButtonItem = leftButton;


// 然后通过 [self.navigationController popViewControllerAnimated:YES]; 返回上一级视图


-(void)pushActions

{

    [self.navigationControllerpopViewControllerAnimated:YES];

}





问题 六 自定义一个导航栏按钮

- (id)initWithCustomView:(UIView *)customView;


我在返回按钮的视图里右边又加了一个返回按钮 但是通过自定义的方式


    UIButton * rightbtn = [UIButton  buttonWithType:UIButtonTypeCustom];

    rightbtn.frame =CGRectMake(8,10,25,20);

    [rightbtn setBackgroundImage:imge forState:UIControlStateNormal];

    UIBarButtonItem *  revealButtonItem = [[UIBarButtonItem  alloc]initWithCustomView:rightbtn];

    self.navigationItem.rightBarButtonItem = revealButtonItem;

我们发现api 提供的这个方法的参数是个view

如果加个button 不是很明显那么我们就添加个textfield 把 这样更直观


    UITextField *textfield = [[UITextFieldalloc]initWithFrame:CGRectMake(8,10,80,25)];

    textfield.placeholder =@"hello";

    textfield.backgroundColor = [UIColorwhiteColor];

    UIBarButtonItem *  revealButtonItem = [[UIBarButtonItemalloc]initWithCustomView:textfield];

    self.navigationItem.rightBarButtonItem = revealButtonItem;

   

    问题 七  在导航栏中间添加分段控件

  主要是通过这个函数   self.navigationItem.titleView = segment;



    NSArray *buttonName = [NSArrayarrayWithObjects:@"周杰伦",@"张学友",@"王大那",nil];

    UISegmentedControl *segment = [[UISegmentedControlalloc]initWithItems:buttonName];

    segment.momentary =YES;

    [segment addTarget:selfaction:@selector(segmengAction:)forControlEvents:UIControlEventEditingChanged];

    self.navigationItem.titleView = segment;


    问题八  导航右侧添加两个buttonItem

    UIBarButtonItem *oneButton = [[UIBarButtonItemalloc]initWithTitle:@"first"style:UIBarButtonItemStyleDone target:self action:@selector(oneButtonAction:)];

    UIBarButtonItem *twoButton = [[UIBarButtonItemalloc]initWithTitle:@"second"style:UIBarButtonItemStyleDone target:self action:@selector(twoButtonAction:)];

    NSArray *actionButtonItems = @[oneButton,   twoButton];

    self.navigationItem.rightBarButtonItems = actionButtonItems;



  问题九  添加导航栏背景图片

   [navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"导航背景.png"] forBarMetrics:UIBarMetricsDefault];



  问题十  知道系统返回按钮事件

   在返回按钮的上一级页面

          在 push 时指定delegate 

            [self.navigationControllerpushViewController:interestJobanimated:YES];

            self.navigationController.delegate =self;

            hideNavigationBar =NO;


- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated

{


    if (hideNavigationBar) {

        

       // 返回事件

     

    }

    hideNavigationBar = YES;

    

}

问题十一 如何pop 回指定的页面

    [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:([self.navigationController.viewControllers count] -2)] animated:YES];




  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值