UINavigationBar(导航条):是通常位于屏幕顶端的控件,继承UIView控件;以stack形式来管理多个UINavigationItem,只是作为UINavigationItem的容器。
UINavigationItem(导航项):也是作为一个容器,它由标题、左边N个按钮、右边N个按钮组成,每个按钮都是UIBarButtonItem(按钮)控件
下面先讲述 UINavigationBar + UINavigationItem + UIBarButtonItem ,然后主要 UINavigationController
导航控制器最主要。
UINavigationBar/UINavigationItem用法:
1.创建导航条
UINavigationBar *navBar=[[UINavigationBar alloc]initWithFrame:CGRectMake(CGFloat x,y,width,height);
2.将导航条加入到视图中
[self.view addSubview:navBar];
[navBar setTintColor:[UIColor whiteColor]];//设置导航条上的按钮字体颜色。
//[navBar setBackgroundColor:[UIColor redColor]];//这个方法是用来设置位于栈底的背景色的吧
[navBar setBarTintColor:[UIColor redColor]];//设置导航条navigationBar的背景色
3.创建导航项UINavigationItem,并将此导航项加入到导航条UINavigaionBar中
UINavigationItem* navItem=[[UINavigationItem alloc]initWithTitle:@"导航条标题"];
navBar.items=[NSArray arrayWithObjects:navItem,nil];
4.创建导航条按钮,按钮是加入到UINavigationItem中
//创建一个按钮作为导航条的左边按钮
UIBarButtonItem *barButton=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(---)/nil];
navIte.leftBarButtonItem=barButton;
//创建多个按钮作为导航条的按钮,使用NSArray数组
UIBarButtonItem *barButton=[[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(clickLeftButton)];
UIBarButtonItem *spaceItem=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
UIBarButtonItem *buttonImage=[[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"返回按钮普通32"] style:UIBarButtonItemStylePlain target:self action:@selector(clickLeftButton)];
navItem.leftBarButtonItems=[NSArray arrayWithObjects:buttonImage,barButton,spaceItem,nil];//把barButton按钮设置为导航条的右边的按钮
UIBarButtonItem用法:
有两个常用方法:
- (instancetype)initWithTitle: style:(UIBarButtonItemStyle)style target:target action:action;
- (instancetype)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:target action:action;
- (instancetype)initWithCustomView:(UIView *)customView;
其中在UIBarButtonItem中区分UIBarButtonItemStyle和UIBarButtonSystemItem;
UIBarButtonItemStyle(三个)分类:
UIBarButtonItemStylePlain,
UIBarButtonItemStyleBordered,
UIBarButtonItemStyleDone;
UIBarButtonSystemItem分类:
UIBarButtonSystemItemDone,UIBarButtonSystemItemCancel,UIBarButtonSystemItemEdit,UIBarButtonSystemItemSave,UIBarButtonSystemItemAdd,
UIBarButtonSystemItemFlexibleSpace,UIBarButtonSystemItemFixedSpace,
UIBarButtonSystemItemCompose,
UIBarButtonSystemItemReply,
UIBarButtonSystemItemAction,
UIBarButtonSystemItemOrganize,
UIBarButtonSystemItemBookmarks,
UIBarButtonSystemItemSearch,
UIBarButtonSystemItemRefresh,
UIBarButtonSystemItemStop,
UIBarButtonSystemItemCamera,
UIBarButtonSystemItemTrash,
UIBarButtonSystemItemPlay,
UIBarButtonSystemItemPause,
UIBarButtonSystemItemRewind,
UIBarButtonSystemItemFastForward,
UINavigationControl用法:
导航控制器。一般会先在代理中操作,导入一个视图控制器作为导航视图控制器的根视图,然后把导航视图作为整个视图的根视图。
*在代理文件AppDelegate.m文件中(*经过测试后UINavigation只可以用在代理文件中进行设置,其它方法均不可以用)
1.先设置屏幕宽度和背景色
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
2.导入一个视图将作为导航视图控制器的根视图控制器,然后在把导航视图控制器作为整个视图的根视图控制器。
ViewController *VC1 = [[ViewController alloc]init];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:VC1];//将VC1作为UINavigationController根视图。
[_window setRootViewController:nav];//将导航视图nav作为window的根视图控制器。
[self.window makeKeyAndVisible];
——转入到导航视图控制器的根视图控制器中
1.设置导航条的标题:self.title=@"导航条的标题";
2.设置navigationBar导航栏的背景颜色:[self.navigationController.navigationBar setBarTintColor:[UIColor ...]];
3.设置navigationBar导航栏上的按钮(返回/右边按钮)的文字的颜色:[self.navigaitonController.navigationBar setTintColor:[UIColor ...]];//tintColor影响所有按钮标题和按钮图像
4.设置navigationBar导航栏上标题字体颜色:[self.navigationController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor],UITextAttributeTextColor,nil]];/[... setTitleTextAttributes:@{UITextAttributeTextColor:[UIColor whiteColor]}]
实现3的另一种方法:
[[UINavigationBar appearance] setBarTintColor:[UIColor redColor]];
//@{}代表Dictionary
[[UINavigationBar appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
>改变导航栏标题的字体属性:
UITextAttributeFont - 字体
UITextAttributeTextColor - 文字颜色
UITextAttributeTextShadowColor - 文字阴影颜色
UITextAttributeTextShadowOffset - 偏移用于文本阴影
NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8];
shadow.shadowOffset = CGSizeMake(0, 1);
[self.navigationController.navigationBar setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName, shadow, NSShadowAttributeName,
[UIFont fontWithName:@"HelveticaNeue-CondensedBlack" size:21.0], NSFontAttributeName, nil]];
5.设置左右按钮:self.navigaitionItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"左边按钮" style:UIBarButtonItemStylePlain target:self action:nil];self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"右边按钮"style:UIBarButtonItemStylePlain target:self action:nil];
(在设置左右按钮时,使用UINavigationController时,自定义的按钮会覆盖系统自带的按钮)
——6.设置返回按钮字体自定义:self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"我的返回按钮" style:UIBarButtonItemStyleDone target:nil action:nil];
-或者直接使用UIBarButtonItem创建按钮改变字体大小、颜色,UIBarButtonItem *bBtn=[...];[btn setTitleTextAttributes: forState:];[bBtn setTitle:@" "];
7.图片作为导航栏标题使用titleView:self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"。。"]];
8. 设置导航栏半透明:self.navigationController.navigationBar.translucent=NO;
8. 从导航栏下面开始算坐标(不考虑导航栏):self.edgesForExtendedLayout=UIRectEdgeNone;
UINavigaitonController
还有push/pop操作
在一个视图中
[self.navigaitonController pushViewController:VC animated:YES]; // 入栈某个VC
[self.navigaitonController popToViewController:VC animated:YES]; // 出栈某个VC
[self.navigaionController popViewController:YES]; // 当前当前最顶部控制器VC
即可实现该视图出栈就可以返回到跳转到那个的视图。
关于在使用UINavigationController的各种自定义:
1.iOS导航栏返回按钮自定义 -- 自定义文字和图像
>> 1) 自定义文字--想要返回按钮显示不同的文字,只需在父视图进行这样修改:
//重新创建一个barButtonItem
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithTitle:@"你想要设置的返回按钮文字" style:UIBarButtonItemStylePlain target:nil action:nil];
//设置backBarButtonItem即可
self.navigationItem.backBarButtonItem = backItem;
其中在这里,如果不想让返回按钮显示任何文字,有两种方式:
a.如上述方法所示,只要设置barButtonItem的title为""即可;
b.也可以在本视图中通过[UIBarButtonItem appearance]对文字的范围进行设置,就像这样:
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, NSIntegerMin)
forBarMetrics:UIBarMetricsDefault];
>> 2)自定义返回图片- -提供三种方法
a.网上常用做法
就是在本视图中自定义一个UIButton,然后设置UIButton的图片,再给UIButton添加事件进行返回上级视图的操作,代码类似于:
//创建一个UIButton
UIButton *backButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
//设置UIButton的图像
[backButton setImage:[UIImage imageNamed:@"left_select_img.png"] forState:UIControlStateNormal];
//给UIButton绑定一个方法,在这个方法中进行popViewControllerAnimated
[backButton addTarget:self action:@selector(backItemClick) forControlEvents:UIControlEventTouchUpInside];
//然后通过系统给的自定义BarButtonItem的方法创建BarButtonItem
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithCustomView:backButton];
//覆盖返回按键
self.navigationItem.leftBarButtonItem = backItem;
这种方式也可以达到目的,不过通过这种方式自定义返回按钮之后,系统的右滑返回的手势就会无法识别,通常的解决办法是再添加一个全局的手势操作。而且,这个方法自定义完之后的返回按钮一般都会偏右,然后再调位置。
下面的b,c两种方法在使用后右划手势依然存在。
b.在本视图中修改- - 在本方法中设置后,会出现把导航栏标题的位置挤压改变
//方法1:在本视图中设置
UIImage *backButtonImage = [[UIImage imageNamed:@"left_select_img.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 40, 0, 0)
resizingMode:UIImageResizingModeTile];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage
forState:UIControlStateNormal
barMetrics:UIBarMetricsDefault];
//参考自定义文字部分
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(NSIntegerMin, NSIntegerMin)
forBarMetrics:UIBarMetricsDefault];
c.在父视图中修改
//方法2:通过父视图NaviController来设置
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithTitle:@""
style:UIBarButtonItemStylePlain
target:nil
action:nil];
self.navigationController.navigationBar.tintColor =
[UIColor colorWithRed:0.99 green:0.50 blue:0.09 alpha:1.00];
//主要是以下两个图片设置
self.navigationController.navigationBar.backIndicatorImage = [UIImage imageNamed:@"left_select_img.png"];
self.navigationController.navigationBar.backIndicatorTransitionMaskImage = [UIImage imageNamed:@"left_select_img.png"];
self.navigationItem.backBarButtonItem = backItem;
2.在设置navigationBar底部图片和颜色时,去除导航栏底部的黑线-四种方法
> 方法一.当设置navigationBar的背景图片时移除黑线的方法,该方法会使translucent属性失效
-(void)useShadowImageRemoveBlackLine
{
//通过设置shadowImage移除黑线
[self.navigationController.navigationBar setShadowImage:[UIImage new]];
}
> 方法二.当设置navigationBar的背景图片或背景色时,使用该方法都可移除黑线,且不会使translucent属性失效(推荐)
-(void)useMethodToFindBlackLineAndHind
{
UIImageView* blackLineImageView = [self findHairlineImageViewUnder:self.navigationController.navigationBar];
//隐藏黑线(在viewWillAppear时隐藏,在viewWillDisappear时显示)
blackLineImageView.hidden = YES;
}
- (UIImageView *)findHairlineImageViewUnder:(UIView *)view
{
if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0)
{
return (UIImageView *)view;
}
for (UIView *subview in view.subviews) {
UIImageView *imageView = [self findHairlineImageViewUnder:subview];
if (imageView) {
return imageView;
}
}
return nil;
}
> 方法三.简单移除黑线方法,会使translucent失效
-(void)useClipsToBoundsRemoveBlackLine
{
//设置移除黑线
self.navigationController.navigationBar.clipsToBounds = YES;
}
> 方法四.移除黑线(不推荐)
-(void)removeBlackLine
{
[self.navigationController.navigationBar setBackgroundImage:[UIImage new]
forBarPosition:UIBarPositionAny
barMetrics:UIBarMetricsDefault];
[self.navigationController.navigationBar setShadowImage:[UIImage new]];
}
>> 当有多个导航控制器时,一次设置多个导航控制器
UINavigationBar *navBar = [UINavigationBar appearance] ;
// 所有导航条颜色都会改变 -- 一键设置
//navBar.barTintColor = [UIColor yellowColor] ;
[navBar setBackgroundImage:[UIImage imageNamed:@"bg_nav.png"] forBarMetrics:UIBarMetricsDefault] ;