UINavigationBar(导航条)
- 父类是UIView
- 一个UINavigationController(导航控制器)只有一个导航条,子控制器共用同一个导航条
- 导航条不一定是由导航控制器本身设置的
- 导航控制器的导航条高度是44,宽度与屏幕同齐;背景高64,宽度与屏幕同齐
导航控制器与导航条(navigationBar)
导航条本身内容(背景图片设置等),由导航控制器设置;子控制器要设置,需要拿到navigationController.navigationBar设置
-
一般是在initilize统一设置
#pragma mark - initilize + (void)initialize { [super initialize]; // 判断是否是导航控制器本身,子类也返回 if(self != [BSNachildViewControllerontroller class])return; // 获取UINavigationBar外观 UINavigationBar *bar; // 版本适配 if (IOS_VERSION < 9.0) { // 只获取这个类本身的导航条,其他导航控制器的导航条不获取 bar = [UINavigationBar appearanceWhenContainedIn:self, nil]; }else { bar = [UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[self]]; } // 背景图片 [bar setBackgroundImage:[UIImage zq_loadImageWithContentsOfFileName:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault]; }
导航条(navigationBar)内部内容(navigationItem):
- 设置栈顶控制器的导航条标题(navigationItem.title),直接拿到UINavigationItem设置title.
childViewController.navigationItem.title = @"导航条标题";
-
设置navigationItem的titleView,控件位置由系统决定,只能设置尺寸。
childViewController.navigationItem.titleView = [[UIImageView alloc] initWithImage:image];
-
导航条左右两边按钮模型(UIBarButtonItem):
- 导航条左右两边按钮通过UIBarButtonItem类型的模型管理,修改模型就会修改按钮
// 返回按钮 childViewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"CS50_activity_image"] style:UIBarButtonItemStyleDone target:self action:@selector(action)]; // 左边的按钮 childViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"CS50_activity_image"] style:UIBarButtonItemStyleDone target:self action:@selector(action)]; // 右边的按钮 childViewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"CS50_activity_image"] style:UIBarButtonItemStyleDone target:self action:@selector(action)]; // 创建模型 UIBarButtonItem *item0 = [[UIBarButtonItem alloc]initWithCustomView:[[UIImageView alloc] initWithImage:image]; UIBarButtonItem *item1 = [[UIBarButtonItem alloc]initWithCustomView:[[UIImageView alloc] initWithImage:image]; // 左边的按钮数组 childViewController.navigationItem.leftBarButtonItems = @[item0,item1]; // 右边的按钮数组 childViewController.navigationItem.rightBarButtonItems = @[item0,item1];
** 注意:在iOS7之后,默认会将导航条上按钮的图片渲染成蓝色,解决方案详见UIImage**
导航条上的返回按钮
- 由上一个控制器决定。
- 如果上一个控制器没有设置标题,默认back
- 如果上一个控制器设置标题,并且没有超过12个字符,默认返回标题和上一个控制器一致,如果超过12个字符,就会变成back。
- 修改返回按钮设置上一个控制器的backBarButtonItem属性,或者设置自身的leftBarButtonItem属性
// 设置上一个控制器的backBarButtonItem childViewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"CS50_activity_image"] style:UIBarButtonItemStyleDone target:self action:@selector(action)]; // 设置自身的leftBarButtonItem属性 pushViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"CS50_activity_image"] style:UIBarButtonItemStyleDone target:self action:@selector(action)];
- 覆盖了系统的返回按钮,侧滑返回功能也会消失,恢复该功能请见拖动手势-边缘侧滑返回手势