iOS状态栏、导航栏的一些笔记分享

前言

IOS的界面分为状态栏和导航栏,如下图所示:

状态栏与导航栏的位置如上图,我们可以通过[UIApplication sharedApplication].statusBarFrame.size获取状态栏的size(一般没有刘海时的高度为20,有刘海时的高度为44)。

通过self.navigationController.navigationBar.frame.size获取导航栏的size(一般高度为44,大标题时高度为xyz,当然也可以通过自定义来改变导航栏样式)。

***ps:***在我们通过[nav.navigationBar setBarTintColor:[UIColor lightGrayColor]];来设置导航栏颜色时,将导致导航栏和状态栏背景色均变为浅灰色。

1. 状态栏内容是否高亮

状态栏内容包括信号、时间、电量等,只有两种颜色样式(黑或白)。iOS开发过程中提供修改状态栏内容颜色样式的方法:

在代码中设置状态栏内容颜色:info.plist文件中直接设置状态栏内容颜色:在info.plist中添加字段View controller-based status bar appearance, 当其取值为YES时,表示以UIController对状态栏的设置为准,UIApplication对状态栏进行的设置将不起作用。

// 在controller中重写该方法,并返回相应值
- (UIStatusBarStyle)preferredStatusBarStyle {

 return UIStatusBarStyleLightContent;
}

// 注意:
// 当controller嵌入UINavigationController中时,controller中的方法preferredStatusBarStyle是不会自动被调用的,而navController中的该方法会被调用;
// 当有navController时,在重写controller中的preferredStatusBarStyle方法同时,我们还应重写navController中的childViewControllerForStatusBarStyle方法。
- (UIViewController *)childViewControllerForStatusBarStyle {

 return self.topViewController;
}

当字段View controller-based status bar appearance取值为NO时,则以UIApplication为准,控制器设置状态栏的方法preferredStatusBarStyle则根本不会被调用。

// 状态栏内容-黑色
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
// 状态栏内容-白色
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

在info.plist文件中直接设置状态栏内容颜色:字段View controller-based status bar appearance取值为NO,且Status bar style取值为UIStatusBarStyleLightContent(可选),则不写代码,也可控制应用中的状态栏内容颜色。

2. 隐藏状态栏

整个项目隐藏在Targets -> General -> 勾选 Hide status bar 即可。

在单个界面中隐藏

// iOS 9.0 之前
// 隐藏=YES,显示=NO; Animation:动画效果
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

// iOS 9.0 之后推荐使用这个
// 注意:该方法可以通过UIController中的方法setNeedsStatusBarAppearanceUpdate来间接调用
- (BOOL)prefersStatusBarHidden {

 return YES;
}

注意:上面两个操作状态方法依然受到Info.plist中字段View controller-based status bar appearance取值得影响,该字段取值为YES时,进入controller会自动调用prefersStatusBarHidden方法。当controller嵌入UINavigationController中时,controller中的方法prefersStatusBarHidden是不会自动被调用的,而navController中的该方法会被调用;当有navController时,在重写controller中的prefersStatusBarHidden方法同时,我们还应重写navController中的childViewControllerForStatusBarHidden方法。

- (UIViewController *)childViewControllerForStatusBarHidden {

 return self.topViewController;
}

启动页隐藏状态栏,进入程序后正常显示状态栏
首先,在Targets->General->勾选中Hide status bar或者在info.plist里面 Status bar is initially hidden 设置为 YES;
其次,在AppDelegate.m中添加代码

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
 [application setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
}

3. 导航栏

UINavigationController的视图层次结构比较清晰,用户可见的导航栏即为其中的***UINavigationBar***,通过它,我们就可以修改导航栏的样式。下面我们就逐步介绍一些常用的关于导航栏的操作。

导航栏常用操作

// 隐藏导航栏
//[self.navigationController setNavigationBarHidden:YES];
[self.navigationController setNavigationBarHidden:YES animated:YES];

// 设置导航背景为红色
[self.navigationController.navigationBar setBarTintColor:[UIColor redColor]];

// 设置navigationBar的透明效果
[self.navigationController.navigationBar setTranslucent:YES];
//设置导航栏的背景图片
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"imgName"] forBarMetrics:UIBarMetricsDefault];

// Attributes 属性
NSDictionary *textAttributes = @{NSForegroundColorAttributeName:[UIColor whiteColor],NSFontAttributeName:[UIFont systemFontOfSize:30]};
// 设置导航栏标题的字体大小、颜色
[self.navigationController.navigationBar setTitleTextAttributes:textAttributes];

4. 导航栏常用样式

在日常开发中,我们经常需要修改导航栏样式,如使导航栏透明、导航栏尺寸等,在不同样式导航栏之间的切换时还要注意是否平顺...(隐藏,与正常导航栏的切换)

导航栏大标题

if (@available(iOS 11.0, *)) {
  [self.navigationController.navigationBar setPrefersLargeTitles:YES];
}

自定义导航栏大标题样式

重写UINavigationBar中的layoutSubviews方法,可通过发送通知的形式来监听导航栏高度变化,如下:

-(void)layoutSubviews {
 [super layoutSubviews];

 [[NSNotificationCenter defaultCenter] postNotificationName:KEY_UINavigationBar_Height_Changed object:self userInfo:nil];
}

使导航栏透明

当需要设置导航栏透明且title等项正常显示时,最好将设置过程置于viewWillAppear:方法中:

//// 需要导航栏透明的ViewController中
- (void)viewWillAppear:(BOOL)animated {

 [super viewWillAppear:animated];

 _navView.hidden = NO;
 self.edgesForExtendedLayout = UIRectEdgeTop;
 self.navigationController.navigationBar.translucent = YES;
 [self.navigationController.navigationBar setShadowImage:[UIImage new]];
 [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
 [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]}];
}

//// 导航栏为非透明的ViewController中
- (void)viewWillAppear:(BOOL)animated {

 [super viewWillAppear:animated];

 self.edgesForExtendedLayout = UIRectEdgeNone;
 self.navigationController.navigationBar.translucent = NO;
 [self.navigationController.navigationBar setShadowImage:nil];
 [self.navigationController.navigationBar setTintColor:[UIColor blackColor]];
 [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
 [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor blackColor]}];
}

关于自定义导航栏、tabBar的例子将在后续文章中介绍...

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • 深入理解iOS的状态栏

    一.状态栏的隐藏 状态栏的隐藏主要有两种方法,下面来一起看看吧. 方法一:通过代码控制 @interface UIApplication(UIApplicationDeprecated) // Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system. @property(readwrite, nonatomic,ge

  • iOS 自定义状态栏和导航栏详细介绍

    iOS 自定义状态栏和导航栏 开发IOS APP 经常会根据需求更改状态栏和导航栏,这里整理了几种方法,大家可以看下. 导航栏透明 -(void)viewWillAppear:(BOOL)animated { //viewWillAppear中设置透明 [super viewWillAppear:animated]; [self.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]; /

  • 详解在iOS App中自定义和隐藏状态栏的方法

    自定义状态栏 有时候,需要在状态栏上显示一些自定义信息,比如新浪微博的官方iOS客户端:告知用户信息处于发送队列.发送成功或者发送失败. 如上图,通过在状态栏显示自定义信息,可以给用户友好又不影响软件使用的提示. 为此,我们显得定义一个自定义状态栏类,包含一个显示信息的Label: 复制代码 代码如下: @interface CustomStatusBar : UIWindow  {      UILabel *_messageLabel;  }    - (void)showStatusMes

  • IOS点击按钮隐藏状态栏详解及实例代码

    IOS点击按钮隐藏状态栏详解 前言: 最近学习IOS的基础知识,实现隐藏状态栏的功能,这里就记录下来,希望对大家有所帮助 实例代码: @interface SecondViewController () @property (nonatomic, assign,getter=isHideStatus) BOOL hideStatus; @end @implementation SecondViewController - (void)viewDidLoad { [super viewDidLoa

  • 图文讲解如何解决App的iOS 7顶部状态栏适配问题

    首先说明下,ios7中,由于status bar不再占用单独的20px,如果app需要同时支持ios7和ios6.1以下,那就需要适配下了,适配开始: 先看用xcode新建项目后 IOS7和IOS6上的的运行效果: ps:一个empty application 里面+了一个rootcontroller,作为window的根控制器,view里面放了一个tableview; 是不是遇到的IOS7的新问题,状态栏跟tableview重叠了,OK,看见这个不想看到的结果,下面我们就开始正式的解决掉这个招

  • iOS 设置状态栏的背景颜色方法

    设置状态栏的背景颜色 - (void)setStatusBarBackgroundColor:(UIColor *)color { UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"]; if ([statusBar respondsToSelector:@selector(setBackgro

  • iOS实现点击状态栏自动回到顶部效果详解

    前言 大家都知道实现状态栏(statusBar)点击自动回到顶部效果,旨在为用户在浏览界面时提供便利,点击状态栏能够快速回到界面顶部,所以主要针对可以滚动的UIScrollView和其子类UITableVIew和UICollectionView. 这里将从以下几个方面实现该功能. 1.苹果自带功能 分析: 首先,苹果自己已经提供了该功能,往上滑动tabView,点击statusBar,tableView会自动回到初始位置.如下图所示,此时点击statusBar,屏幕最上方显示的将是第一个cell

  • iOS在状态栏上显示提醒信息的功能定制

    先看效果图 实现这个效果,用到了JDStatusBarNotification,这是一个易于使用和定制的在状态栏上显示提醒信息的控件,可自定义颜色.字体以及动画,支持进度条展示,并可以显示活动指示器. 假设这么一个场景,需要调接口修改个人资料,这时有3个状态,正在修改.修改成功.修改失败.我们可以写一个公共类,方便调用,譬如 NSObject+Common. .h文件写方法 #import <Foundation/Foundation.h> @interface NSObject (Commo

  • iOS 隐藏导航条和状态栏实现方法

     iOS  隐藏导航条和状态栏实现方法 状态栏的高度是20,导航栏的高度是44,如果同时存在状态栏的导航条,我们通常会设置view上的控件的位置的X 大于等于 64. 一:隐藏导航条:self.navigationController.navigationBarHidden = YES; 二:隐藏状态栏: 第一步:在info.plist 文件里增加两个类型(Type)为bool 选项, Status bar is initially hidden 设为YES:View controller-ba

  • IOS 开发状态栏隐藏的实现办法

    IOS 开发状态栏隐藏的实现办法 解决方法:  IOS7以下版本隐藏UIStatusBar的方法: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [application setStatusBarHidden:YES]; return YES; } 升级到iOS7后的方法: 在基类中重载UIViewController.h

随机推荐