UINavigationController(二)

           在使用UINavigtionController的时候,经常会弄不清哪些属性是UINavigationController的,哪些属性是UIViewController的。而且在更改导航栏和工具栏的样式的时候,经常会于遇到api使用下去没有效果的情况。总之,一直用得比较混乱,今天要好好做一个总结,把那些常用的功能都搞清楚。


一、如何往导航栏和工具栏添加按钮

1、navigationItem属性

        这个属性是UIViewController在UINavigationControllerItem类目下的。

@property(nonatomic,readonly,retain)UINavigationItem *navigationItem; 

文档的解释:在必要的时候会创建该属性对象,以便于控制器可以定制它自己的导航栏外观。

UINavigationItem有以下属性:

@property(nonatomic,retain)UIBarButtonItem *leftBarButtonItem;//导航栏左边的按钮,位置与“返回”按钮相同

@property(nonatomic,retain)UIBarButtonItem *rightBarButtonItem;//导航栏右边的按钮

@property(nonatomic,retain)UIBarButtonItem *backBarButtonItem; //如果前面的那个控制器有title内容,则back button的内容为<title,如果没有title,默认显示<back

@property(nonatomic,retain)UIView *titleView;//自定义title的样式

@property(nonatomic,copy)NSArray *leftBarButtonItems NS_AVAILABLE_IOS(5_0);//使用该属性,能在导航栏左边显示多个按钮

@property(nonatomic,copy)NSArray *rightBarButtonItems NS_AVAILABLE_IOS(5_0);//类似leftBarButtonItems属性

@property(nonatomic,copy)NSString *title;//给它赋值的效果相当于给控制器的title属性赋值一样

@property(nonatomic,copy)NSString *prompt; //文字内容会显示在title的上面,这个属性会使得导航栏的高度增加30

@property(nonatomic) BOOL leftItemsSupplementBackButton NS_AVAILABLE_IOS(5_0);//默认值为NO,在leftbutton和backbutton同时存在的情况下,只显示leftbutton;如果设为YES,将会显示backbutton和leftbutton,backbutton显示在leftbutton前面

@property(nonatomic,assign)BOOL hidesBackButton; 



2、toolbarItems属性

          这个属性是UIViewController在UINavigationControllerContextualToolbarItems类目下的。

@property (nonatomic,retain)NSArray *toolbarItemsNS_AVAILABLE_IOS(3_0);

功能:在UIViewController中创建一系列UIBarButtonItem对象,将这些对象添加到toolbarItems数组中,这些UIBarButtonItem按钮就会显示在控制器底部的工具栏中。

代码如下:

UIBarButtonItem *refreshItem = [[UIBarButtonItem alloc]initWithCustomView:refreshButton];
    //每个控制器有自己的toolbaritems属性,管理工具栏的数组
[self setToolbarItems:[NSArray arrayWithObjects:refreshItem, nil]];


二、如何定制导航栏和工具栏的样式

1、导航栏的样式:

          navigationBar是UINavigationController的属性

(1)导航栏左右两边的按钮
         从ios7开始,tintColor属性只能设置导航栏上按钮的字体颜色,无法影响到导航栏的背景色。
(2)导航栏中间的title
        从ios5开始,titleTextAttributes属性可以设置title的字体、颜色、大小等。
     例如:
[self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor redColor],NSFontAttributeName:[UIFont boldSystemFontOfSize:20]}];

          NSForegroundColorAttributeName是关键字,表示文字的颜色

          NSFontAttributeName表示字体大小和样式。//这里的两个关键字是ios7开始才有的,ios7之前有另外的对应关键字

(3)导航栏的背景
         颜色:从ios7开始,导航栏的背景色由barTintColor来设置,它会把状态栏也变成一样的颜色。
         背景图:从ios5开始,

- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics用于设置导航栏背景图片

(4)导航栏的显示与隐藏

         只有UINavigationController的navigationBarHidden属性才能控制导航栏的显示和隐藏。

2、工具栏的样式:

         toolbar是UINavigationController的属性

(1)工具栏的按钮

         与navigationbar一样的情况,从ios7开始,tintcolor属性设置按钮的字体颜色

(2)工具栏的背景色

         bartintcolor设置工具栏的背景颜色

(3)工具栏的背景图片

- (void)setBackgroundImage:(UIImage *)backgroundImage forToolbarPosition:(UIBarPosition)topOrBottom barMetrics:(UIBarMetrics)barMetrics

(4)工具栏的显示和隐藏

         只有UINavigationController的toolbarHidden属性才能控制导航栏的显示和隐藏。

三、NavigationBar的显示困惑

1、leftbutton和backbutton

(1)如果当前控制器设置了leftbutton,优先显示leftbutton

(2)如果当前控制器没有设置leftbutton,且当前控制器不是导航控制器的根,则显示前面那个控制器的backbutton。如果前面那个控制器没有指定backbutton,则系统会根据前一层的控制器的title属性生成一个backbutton。如果前一层控制器的title为“pre”,则backbutton显示为“<pre”,否则显示为“<back”.

       可以说,当前控制器的backbutton是为后面的那个控制器准备的。

(3)如果当前控制器没有leftbutton,且当前控制器是导航控制器的根,则导航栏左边没有任何显示。

2、控制器的title和navigationItem的title、titleView

(1)如果navigationItem的titleview属性有指定,优先显示titileview的样式

(2)如果titleview没有指定,优先显示navigationItem的title的文字

(3)如果navigationItem的title没有指定,就以控制器的title属性来显示。


四、导航控制器的栈

1、UINavigationController的viewControllers属性NSArray类型,存放当前在导航控制器栈内的所有视图控制器。

2、topViewController属性指的是导航控制器栈顶的视图控制器。

3、visibleViewController属性,如果栈顶的控制器还显示了一个模态视图控制器,则指向该模态视图控制器,否则就是栈顶的那个视图控制器。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值