- UINavigationController的子控制器
//UINavigationController以栈的形式保存子控制器
@property(nonatomic,copy) NSArray *viewControllers;
@property(nonatomic,readonly) NSArray *childViewControllers;
//使用push方法能将某个控制器压入栈
- (void)pushViewController:(UIViewController *)viewController
animated:(BOOL)animated;
//使用pop方法可以移除控制器
//将栈顶的控制器移除
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
//回到指定的子控制器
- (NSArray *)popToViewController:(UIViewController *)viewController
animated:(BOOL)animated;
//回到根控制器(栈底控制器)
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;
- 如何修改导航栏的内容
//导航栏的内容由栈顶控制器的navigationItem属性决定
//UINavigationItem有以下属性影响着导航栏的内容
//左上角的返回按钮
@property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
//中间的标题视图
@property(nonatomic,retain) UIView *titleView;
//中间的标题文字
@property(nonatomic,copy) NSString *title;
//左上角的视图
@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
//右上角的视图
@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;
导航栏的注意点
- 在iOS7之后默认会把导航条上面的按钮渲染成蓝色 在加载图片的时候声明不要渲染
UIImage *image = [UIImage imageNamed:@"imageName"];
// 通过代码不要渲染图片
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
- 导航条上面的内容位置不能由开发者决定,开发者只能控制尺寸 示例:
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setImage:[UIImage imageNamed:@"imageName"] forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:@"imageName"] forState:UIControlStateHighlighted];
//btn.frame = CGRectMake(2000, 2000, 30, 30); 位置无效 尺寸有效
// 控件的尺寸由图片决定 仅仅是设置尺寸
[btn sizeToFit];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btn];
导航栏的常见问题
导航栏在push和pop时候颜色混乱的问题
navigationBar的默认颜色是浅白色 并且有透明效果 所以如果view的颜色是其他颜色的话 navigationBar就会在push、pop的时候产生一些暗灰色的效果 如果设置的是图片就没有这样的效果
覆盖导航栏的返回按钮侧滑返回功能失效的问题
-
navBar的左边的按钮如果被覆盖掉,那么它的的pop手势就没有了 这个时候我们需要自己设置就有效。在只有一个子控制器的时候禁止手势 否则手势在发生的时候就会有bug
self.interactivePopGestureRecognizer.delegate = self; - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{ // 手势何时有效 : 当导航控制器的子控制器个数 > 1就有效 return self.childViewControllers.count > 1; }
有时候需要自定义左边返回按钮距离屏幕边缘的距离问题
让内容的内边距向左偏移 这个时候button的内容就会偏出button的frame 但是由于navBar的左边返回的触发范围是比较大的 所以不必担心 点击了超出部分button不响应的问题
backButton.contentEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0);