UINavigationBar 继承于UIView 最好避免直接在上面添加界面元素,在push pop 中,系统不会处理,会一直存在。需要在viewWillAppear viewWillDisappear添加 删除
1. barStyle
UIBarStyleDefault(默认样式)白色条,底部有一边线,适用深色标题,状态栏字体也是黑色,系统大多数应用都是这种样式。
UIBarStyleBlack 黑色条,底部有一边线,适用于浅色的标题,状态栏的字体也会是白色,iTunes Store 是这个样式
还有两种已经废弃了的样式
UIBarStyleBlackOpaque Deprecated. Use UIBarStyleBlack
UIBarStyleBlackTranslucent Deprecated. Use UIBarStyleBlack and set the translucent property to YES
底部一像素的线
2.translucent (默认是YES iOS7出现的 设置导航条是否透明)
有设置自定义背景图时可能出现的情况
1)默认依据图来设置是否透明,当图上只要有任意像素是alpha小于1,就YES
2)设置的背景是不透明的图片,也能通过设置translucent 为YES,系统会使用一张opacity值小于1的图
3)设置的背景是透明的图片,设置translucent为NO,系统会使用一张不透明的背景图
3.颜色,背景图 (一般是设置了背景图,设置的颜色就会被遮掉,透明的图片会露出底色,注意层级关系)
self.navigationController.navigationBar.backgroundColor = [UIColor redColor]; //UINavigationBar
self.navigationController.navigationBar.barTintColor = [UIColor cyanColor]; //_UIBarBackground 已废弃的tintColor
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"custom_navBar_opaque"] forBarMetrics:UIBarMetricsDefault]; //UIImageView
self.navigationController.navigationBar.translucent = NO;
self.navigationController.navigationBar.translucent = NO;
当没有设置背景图片的时候
有设置背景图片
4.shadowImage
(默认是nil , 会显示默认的一张shadow image)
当想用自定义的shadowImage替换默认图片时,也要设置自定义背景图,否者依然是默认阴影图片
5.UINavigationBar默认有一个UINavigationItem
@property(nullable, nonatomic,readonly,strong) UINavigationItem *topItem;
@property(nullable, nonatomic,readonly,strong) UINavigationItem *backItem; //默认是空
通过类别方法 self.navigationItem 拿到的也是默认的这个
6.UINavigationItem : NSObject
title
titleView
prompt
backBarButtonItem
leftBarButtonItems
rightBarButtonItems
6.1 UIBarButtonItem : UIBarItem (导航栏上的按钮,类似UIButton)
@property(nonatomic) UIBarButtonItemStyle style; // default is UIBarButtonItemStylePlain
@property(nullable, nonatomic,strong) __kindof UIView *customView; // default is nil
@property(nullable, nonatomic) SEL action; // default is NULL
@property(nullable, nonatomic,weak) id target; // default is nil
6.2 UIBarItem : NSObject(类似UIView)
enabled
title
image
tag
imageInsets
landscapeImagePhoneInsets
- (void)setTitleTextAttributes:(nullable NSDictionary*)attributes forState:(UIControlState)state NS_AVAILABLE_IOS(5_0) UI_APPEARANCE_SELECTOR;
7.UIAppearance 协议
对实现了这个协议的类(UIView,UIBarItem)自定义这个类的所有实例的外观,很牛逼的感觉
+ (instancetype)appearance;
也可以修改某一特定容器类中所有UIButton的外观(如UIBarButtonItem)。
+ (instancetype)appearanceWhenContainedInInstancesOfClasses:(NSArray> *)containerTypes NS_AVAILABLE_IOS(9_0);
实现所有的navigationBar 都是同一个背景图
需要注意的是,这种修改只会影响到那些执行UIAppearance操作之后添加到我们的视图层级架构中的视图或控件,而不会影响到修改之前就已经添加的对象
遗留:UINavigationBarDelegate
参考:http://www.cocoachina.com/ios/20150723/12671.html