iOS学习之UINavigationController
下述属性全为iOS7以后
设置导航条风格
self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
设置导航条背景颜色
self.navigationController.navigationBar.backgroundColor = [UIColor redColor];
设置导航条背景颜色时,导航条风格不能是UIBarStyleDefault。
设置导航条背景图片
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navBg"] forBarMetrics:UIBarMetricsDefault];
UIBarMetricsDefault 为iPhone的模式(竖屏叫做人像模式、横屏叫做风景模式),设置背景图片后,背景颜色会被遮挡。图片尺寸高度需为44。如果过窄会被平铺填充,过大会超出。但是可以设置导航条的另一个属性来进行裁剪。如果想导航条填充到状态栏,高度设为64,clipsToBounds需为NO。
self.navigationController.navigationBar.clipsToBounds = YES;
设置状态栏样式(深色背景白色文字、浅色背景黑色文字)
1、info.plist中添加 View controller-based status bar appearance设置为NO,然后通过全局的application设置
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
如果为YES,改方法无效。(默认为YES)
2、如果ViewController没在UINavigationController中,则可以通过覆盖preferredStatusBarStyle方法实现,不过得在ViewDidLoad中调用
-(void)viewDidLoad {
[super viewDidLoad];
[self setNeedsStatusBarAppearanceUpdate];
}
-(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleDefault; }
3、如果ViewController在UINavigationController中,方法2无效。因为调用 setNeedsStatusBarAppearanceUpdate 只会进入到UINavigationController中的preferredStatusBarStyle中。可以通过UINavigationBar的barStyle属性来影响状态栏。如
//status bar的字体为白色 //导航栏的背景色是黑色。 self.navigationController.navigationBar.barStyle = UIBarStyleBlack; //status bar的字体为黑色 //导航栏的背景色是白色,状态栏的背景色也是白色。 self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
或者可以通过子类化UINavigationController如MyNav,在MyNav中实现preferredStatusBarStyle方法,并将ViewController加到MyNav中。然后通过方法2实现
MyNav* nav = [[MyNav alloc] initWithRootViewController:vc]; self.window.rootViewController = nav; @implementation MyNav - (UIStatusBarStyle)preferredStatusBarStyle { UIViewController* topVC = self.topViewController; return [topVC preferredStatusBarStyle]; //可以实现在viewController中定制 }
设置导航条隐藏
self.navigationController.navigationBarHidden = YES;
iOS7以后,视图控制器的view的起始点是从屏幕最顶端开始,包括状态栏。因此布局时需要留出20像素。
UINavigationItem详解
常用属性和方法:
@property(nonatomic, copy) NSString *title; //设置标题,显示在导航栏中间 @property(nonatomic, retain) UIView *titleView; //设置标题视图,显示在导航栏中间位置 @property(nonatomic, retain) UIBarButtonItem *leftBarButtonItem; //左侧按钮 @property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem; //右侧按钮 -(void)setLeftBarButtonItem:(UIBarButtonItem*)item animated:(BOOL)animated; -(void)setRightBarButtonItem:(UIBarButtonItem*)item animated:(BOOL)animated; -(void)setLeftBarButtonItems:(NSArray *)items animated:(BOOL)animated; //设置左侧的一组按钮 -(void)setRightBarButtonItems:(NSArray *)items animated:(BOOL)animated; //设置右侧的一组按钮
UIBarButtonItem的初始化方法
-(id)initWithImage:(UIImage*)image style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action; -(id)initWithTitle:(NSString*)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action; -(id)initWithBarButtonSystemItem:(UIBarButtonSystemItem*)systemItem target:(id)target action:(SEL)action; -(id)initWithCustomView:(UIView *)customView;
UIBarButtonItemStyle为UIBarButtonItemStylePlain风格时,按钮颜色随导航条的颜色变化,为UIBarButtonItemStyleDone风格时,按钮颜色始终为蓝色。