美文网首页
iOS状态栏和导航栏的设置

iOS状态栏和导航栏的设置

作者: 何以_aaa | 来源:发表于2016-09-05 12:16 被阅读209次

1. 状态栏设置

对状态栏的控制分两种情况:全局设置和分页面设置。控制两种模式的开关是info.plist文件的View controller-based status bar appearance配置项。

1.1 NO:全局设置状态栏。

控制器中对状态栏的控制都将无效,通过下面代码在 didFinishLaunchingWithOptions 中设置

//设置状态栏的字体颜色模式
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
//设置状态栏是否隐藏
[[UIApplication sharedApplication] setStatusBarHidden:YES];

状态栏的背景色取决于导航栏的背景色
状态栏的字体颜色只有2种:UIStatusBarStyleLightContentUIStatusBarStyleDefault

注意:iOS9中 setStatusBarStyle 已经过期,默认状态栏归当前控制器管理。若想全局设置,又受不了警告,可以忽略

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
#pragma clang diagnostic pop

1.2 YES: 分页设置状态栏。

由各控制器来控制状态栏的功能,在这种模式下,全局的设置将无效!!所以我们必须逐个页面对状态栏进行设置,否则状态栏将维持默认的黑色字体和默认为显示状态。

1.2.1 分页字体设置

(1) 当VC不在UINavigationController中时,实现下面方法:

- (UIStatusBarStyle)preferredStatusBarStyle{ 
    //返回白色 
    return UIStatusBarStyleLightContent; 
    //返回黑色 
    //return UIStatusBarStyleDefault;
}

保险起见,在view的某个加载阶段比如viewWillAppear中,调用:

[self setNeedsStatusBarAppearanceUpdate];

(2) 当VC在UINavigationController中时,VC并不能通过(1)的方式控制状态栏的颜色,有一个trick的方法可以在VC中间接的控制

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
1.2.2 设置是否隐藏

(1) 如果是VC本身就是根控制器,实现下面方法:

- (BOOL)prefersStatusBarHidden { 
    return YES;
}

同样保险起见,在viewWillAppear中,调用:

[self setNeedsStatusBarAppearanceUpdate];

(2) 如果VC不是根控制器,那么不像控制字体颜色那样有trick,我们只能间接的通过在子VC中控制根VC,从而间接控制根控制器。
例如 :我的根VC是个tabCon,首先在根tabCon中,实现(1):

@interface YYCTabBarController : RDVTabBarController
//定义一个变量来控制状态栏显示,子VC通过修改这个值来间接控制
@property (nonatomic,assign)BOOL statusBarHidden;
@end
@implementation YYCTabBarController
-(BOOL)prefersStatusBarHidden { 
    return _statusBarHidden;
}
@end

在子VC,即当前要设置的控制器中:

    [super viewWillAppear:animated]; 
    //rdv_tabBarController指向YYCTabBarController
    if([self.rdv_tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){
       [self.rdv_tabBarController performSelector:@selector(setStatusBarHidden:) withObject:@(YES)]; 
       [self setNeedsStatusBarAppearanceUpdate]; 
    } 
}
-(void)viewWillDisappear:(BOOL)animated{ 
    [super viewWillDisappear:animated]; 
    if([self.rdv_tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){
    //注意对NO的情况,不能传@NO,只能传nil才能被当成NO 
    [self.rdv_tabBarController performSelector:@selector(setStatusBarHidden:) withObject:nil]; 
    [self setNeedsStatusBarAppearanceUpdate]; 
    }
  }

2. 导航栏设置

2.1 背景设置

(1) 背景色 :barTintColor属性

全局设置:在 didFinishLaunchingWithOptions 中

[[UINavigationBar appearance] setBarTintColor:[UIColor yellowColor]];

单独设置:在对应控制器中

self.navigationController.navigationBar.barTintColor = NavColor;
(2) 背景图片:setBackgroundImage(注意高度问题,ios7导航栏的高度其实是算上状态栏的,即44+20=64个点的高度)
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@ "nav_bg.png" ] forBarMetrics:UIBarMetricsDefault];

2.2 前景设置

(1) 标题设置:(颜色字体)

标题设置相对比较复杂一些,属性字典格式为:
[NSDictionary dictionaryWithObjectsAndKeys: 属性值1,属性名1,属性值2,属性名2,nil];

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);
NSDictionary *textAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                               [UIColor whiteColor], NSForegroundColorAttributeName,
                               shadow, NSShadowAttributeName,
                               [UIFont fontWithName:@"HelveticaNeue-CondensedBlack" size:21.0], NSFontAttributeName, nil];
[[UINavigationBar appearance] setTitleTextAttributes:textAttributes];
标题.png
(2) 系统按钮设置:(颜色)
[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
(3) 系统按钮设置:(颜色字体)
NSDictionary *textAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                               [UIFont boldSystemFontOfSize:14],NSFontAttributeName, 
                               KTitleWhiteColorFromRGB, NSForegroundColorAttributeName, nil];
[self.navigationItem.rightBarButtonItem setTitleTextAttributes:textAttributes forState:UIControlStateNormal];

2.3 显示设置

设置某VC不显示navigationBar,不显示tabBar,进入VC时改变导航栏的显示状态,而退出时还原:

- (void) viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self.navigationController.navigationBar setHidden:YES]; 
    [self.rdv_tabBarController setTabBarHidden:YES animated:NO];
}
-(void) viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [self.navigationController.navigationBar setHidden:NO]; 
    [self.rdv_tabBarController setTabBarHidden:NO animated:NO];
}

2.4 在有导航栏NavigationBar时定位控件的Y

其他控件:无影响
UIScrollView:VC会对其内部的UIScrollView的内容部分进行一个Inset,这个Inset在上半部分刚好就对应导航栏的高度,包括:UIScrollView,UITableView,UITextView等。这时可视范围的Y坐标就是从64开始的。
解决:

self.automaticallyAdjustsScrollViewInsets = NO;

原文链接:https://segmentfault.com/a/1190000003482218

相关文章

网友评论

      本文标题:iOS状态栏和导航栏的设置

      本文链接:https://www.haomeiwen.com/subject/shdrettx.html