UINavigationBar 设置颜色不起作用,setTintColor失效

本文主要是介绍UINavigationBar 设置颜色不起作用,setTintColor失效,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前UINavigationBar的背景色、标题颜色、按钮颜色,一直没弄得很清楚,知道看到这篇文章:


UINavigationController 层次


UINavigationBar

在此,我们先了解下UINavigationController的层次图,有助于我们更加的了解UINavigationBar


所以通俗地说就是,UINavigationController是个容器,里面可以装很多UIViewController。装这么多UIViewController让用户怎么控制它们呢,总得有个工具吧。这个工具就是UINavigationBar。一个容器就这么一个bar,相当于控制台吧。但是,管理那么多UIViewController,控制台上得按钮啊、标题啊,都千篇一律是不是看起来太无聊了。为了解决这个问题,UINavigationController为每个UIViewController生成一个UINavigationBarItem,通过这个UINavigationBarItem可以改变控制台“上面”得按钮和标题。

简单的说,UINavigationBar是UINavigationController的一个组成部分,就是上面的那个导航栏。UINavigationBar又有UINavigationItem组成。UINavigationItem则有title,按钮,提示文本等组成,就是我们看到的title文字,右上角的按钮。

  • NavigationItem在NavigationBar代表一个ViewController,具体一点儿来说就是每一个加到NavigationController的viewController都会有一个对应的NavigationItem.
  • 一个导航控制器控制多个视图,NavigationBar上的leftItem,rightItem,title是由当前的视图控制器控制的。
一、基本用法


self.title = @"TestTitle";// 与下面相同
//self.navigationItem.title = @"TestTitle";// rightItem
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"Done"style:UIBarButtonItemStyleDonetarget:selfaction:@selector(doneTestAction)];
// leftItem
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"Cancel"style:UIBarButtonItemStylePlaintarget:selfaction:@selector(cancelTestAction)];
二、改变颜色


注意 title的颜色改变和 Item处的颜色方法是不同的

//改变颜色
self.navigationController.navigationBar.barTintColor = [UIColor blueColor];
//改变title颜色
self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor redColor]};
//改变 Item颜色
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];

一般我们也常用下面这个方法改变,但是要注意我们一般只在AppDelegate中有效,或者是 UINavagaitonController中的 RootController 中设置有效,而且只有纯代码的时候才有效。storyboard 在根视图中设置也是没有效果的,以及其他的子视图单独设置都是没有效果的哦。

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
[UINavigationBar appearance].titleTextAttributes =@{NSForegroundColorAttributeName : [UIColor whiteColor]};
[[UINavigationBar appearance] setBarTintColor:[UIColor blueColor]];

当然也可一直用用图片改变的

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav"] forBarMetrics:UIBarMetricsDefault];
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"nav"]  forBarMetrics:UIBarMetricsDefault];
三、隐藏导航栏
self.navigationController.navigationBar.hidden = YES;

状态栏挡住了

但是注意有时状态栏确是不会消失哦,解决这个问题则需要涉及到下面这个问题啦,提到edgesForExtendedLayout

self.edgesForExtendedLayout = UIRectEdgeNone;

edgesForExtendedLayout是一个类型为UIExtendedEdge的属性,指定边缘要延伸的方向。 因为iOS7鼓励全屏布局,它的默认值很自然地是UIRectEdgeAll,四周边缘均延伸,就是说,如果即使视图中上有NavigationBar,下有tabBar,那么视图仍会延伸覆盖到四周的区域。

导航栏动态的消失

if (scrollView.contentOffset.y > 64) {[self.navigationController setNavigationBarHidden:YES animated:YES];
}
else
{[self.navigationController setNavigationBarHidden:NO animated:YES];
}

此处注意navigationBar.hidden与navigationBarHidden的区别

两种方法都是可以隐藏导航栏的,隐藏之后依然可以使用push和pop方法。但是如果用navigationBar.hidden隐藏导航栏,我们可以继续使用navigationBarHidden提供的滑动pop效果,如果用navigationBarHidden,这个操作将无效;但前者navigationBar.hidden没有系统自动的动画效果。

ps 对状态栏处的处理:

此时注意 iOS 7 之后,我们改变状态栏的情况对plist info 的View controller-based status bar appearance设置为YES,则状态栏会根据各个UIViewController的配置改变,UIViewController中如果需要改变状态栏则需要重载以下两个方法:

//状态栏是否隐藏
- (BOOL)prefersStatusBarHidden;
//状态栏样式
- (UIStatusBarStyle)preferredStatusBarStyle;

如果View controller-based status bar appearance为NO,则标示状态栏不受UIViewController的单独控制,那么这个时候状态栏的控制还和iOS7以前的方式一样,在需要修改的地方执行setStatusBarHidden。

 [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

这样状态栏就变成白色啦,但是 iOS 9之后 还是用前一种方法的,重写一下下面这个方法的。

- (UIStatusBarStyle)preferredStatusBarStyle;

四、屏幕原点的改变

此处不对比了 iOS 7之前的,ios6, 确实是从status bar下面开始布局 (0,20),iOS 7之后都是从status bar 左上角(0,0)开始布局的,但是有时,我们也会遇到在 NavigationController 中是以(0,64)布局的,此处又是什么情况呢?先来看一下下面三个属性:

  • extendedLayoutIncludesOpaqueBars
    默认值NO,这个属性指定了当Bar使用了不透明图片时,视图是否延伸至Bar所在区域;因此,如果我们自定义了nav bar背景图片,view会从导航栏下面开始布局。
  • edgesForExtendedLayout
    默认是UIRectEdgeAll,也就是全屏布局(iOS7中鼓励这样,这样可以透过半透明的bar看到一些模模糊糊的内容),如果设置为UIExtendedEdgeNone,view就不会延伸到bar的后面了
  • automaticallyAdjustsScrollViewInsets
    默认值是YES,如果视图里面存在唯一一个UIScrollView或其子类View,,那么它会自动设置相应的内边距(如果有navbar的时候,这个内边距是64,这样scrollview可以占满屏幕,内容在64像素以下,不会被遮到,滑动scrollview,可以透过半透明效果看到scrollview上面的内容)

所以说有时,我们发现原点位置变化了,就可以看看上述几个属性是否有设置改动的。经常我们用到 tableView 或 collectionView 的时候就需要设置 self.automaticallyAdjustsScrollViewInsets = NO, 不让其自动调整。

原文链接: http://www.jianshu.com/p/d8b1ae461fa3




这篇关于UINavigationBar 设置颜色不起作用,setTintColor失效的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/368564

相关文章

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

linux hostname设置全过程

《linuxhostname设置全过程》:本文主要介绍linuxhostname设置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录查询hostname设置步骤其它相关点hostid/etc/hostsEDChina编程A工具license破解注意事项总结以RHE

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2