ios 不被遮挡 阴影_解决ios10导航栏底部阴影线条隐藏失效问题

2016.11.13 21:47* 字数 887 阅读 791评论 0喜欢 16

一、置空阴影图片

基于iOS9,在iOS10上不好使.

[self.navigationController.navigationBar setShadowImage:[UIImage new]];

二、剪裁navigationBar

首先看看UIView的clipsToubounds属性在SDK中的描述:

@property(nonatomic) BOOL  clipsToBounds;

// When YES, content and subviews are clipped to the bounds of the view. Default is NO.

这里的clip是修剪的意思,bounds是边界的意思是,合起来就是:如果子视图的范围超出了父视图的边界,那么超出的部分就会被裁剪掉。但是奇怪的是通过以下代码居然可以实现隐藏navigationBar的底部阴影线条问题:

self.navigationController.navigationBar.clipsToBounds = YES;

对于不是特别熟悉navigationBar结构的同学而言,可能突然有点儿不理解,不过没关系。但是,也由此引申出第三种解决办法,请往下看。

三、遍历navigationBar的字视图

通过打印子视图

NSLog(@"%@",self.navigationController.navigationBar.subviews);

可以得到相应的信息,在iOS9与iOS10上略有不同(基于iPhone6和iPhone7模拟器)

1.在iOS9上可以得到

(

"<_uinavigationbarbackground:>

frame = (0 -20; 375 64);

opaque = NO;

autoresize = W;

userInteractionEnabled = NO;

layer = >",

"<_uinavigationbarbackindicatorview:>

frame = (0 11.5; 13 21);

alpha = 0;

opaque = NO;

userInteractionEnabled = NO;

layer = >"

)

2.在iOS10上可以得到

(

"<_uibarbackground:>

frame = (0 -20; 375 64);

userInteractionEnabled = NO;

layer = >",

"<_uinavigationbarbackindicatorview:>

frame = (0 11.5; 13 21);

alpha = 0;

opaque = NO;

userInteractionEnabled = NO;

layer = >"

)

通过上面的答应信息似乎还看不到什么太多不一样的地方, 就是将UINavigationBarBackground 改成 UIBarBackground, 好像就是苹果改了一个类的名字而已。然而事实远不止如此,不仅是名字改了,其实视图的层次结构也该了,通过子视图没办法获得太多的信息只好写个demo看看了,话不多说直接上图:

图~ios9.png

图~iOS10.png

(图中数字是有对应关系的)

通过图中红色框框里的内容知道阴影的frame = (0 64; 375 0.5);而navigationBar的frame = (0 20; 375 44); 由此知道阴影超出了navigationBar的frame,在navigationBar的下方故而通过设置self.navigationController.navigationBar.clipsToBounds = YES;能够解决问题,但是同时也会带来新的问题

navigationBar.png

想一想,不论是在iOS9中还是iOS10中都会是同一种结果。图中黄色部分才是navigationBar本身的frame,相比图ios9和图ios10很容易看出也切掉了相当于statusBar部分的视图。这样,如果app的navigationBar背景色不是白色的话,那么看起来明显很不好。由此才有以下的遍历子视图的方法:

- (void)hiddenNavigationBarSeparatorLine {

if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) {

NSArray *list=self.navigationController.navigationBar.subviews;

for (id obj in list) {

if ([obj isKindOfClass:[UIView class]]) {

UIView *imageView=(UIView *)obj;

NSArray *list2=imageView.subviews;

for (id obj2 in list2) {

if ([obj2 isKindOfClass:[UIImageView class]]) {

UIImageView *imageView2=(UIImageView *)obj2;

imageView2.hidden = YES;

}

}

}

}

}

}

四、改进第三种方法

其实到了第三种方法,我以为就这么结束了。而事实是在iOS10以前,也确实能够解决问题。第三种方法中''废话''这么多不是白说的,由于navigationBar的层次结构变了,在图~iOS10标注''3''也会被隐藏。之说以这么简单粗暴的直接隐藏主要是因为代码是在iOS9的时候写的,可以很简单就知道在iOS9的时候navigationBar中的UINavigationBarBackground本身不仅仅只是负责frame,而且UINavigationBarBackground的子视图中只有一个imageView就是阴影线条。在iOS10中,UIBarBackground其实就是将UINavigationBarBackground的背景view给抽了出来,UIBarBackground就只是负责frame,背景及阴影线条成为同一级视图结构。我觉得这样的结构更合理一些。

在第三种方法中直接imageView2.hidden = YES;还会导致一个问题,就是如果在navigationBar中添加了某些控件比如:UIButton并且还赋值了背景图片就是出现背景图显示不出来。因为遍历的过程中没有区别出我们想要隐藏的imageView,所以在遍历时应该再找一些更加鲜明的特征。于是有了下的解决办法:

//将第三种方法中的imageView2.hidden = YES;

//简单修改一下(阴影线条的的height为0.5,特征非常明显)

imageView2.hidden = imageView2.bounds.size.height < 1;

五、总结

推荐使用第四种方法,至于为什么不是方法一,各位看官实践了就知道在iOS10该方法就不好使了;方法二会带来新的问题;方法三不够完善。如果用的是swift可以参考这篇文章。如果各位大神还有别的想法,欢迎留言,一同进步。

参考文章:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java的未来项目:巴拿马,织布机,琥珀和瓦尔哈拉

新闻稿“ Oracle Code One Java主题演讲概述了Java的未来 ”在Oracle Code“突出未来项目” Valvala 项目&#xff0c;巴拿马 项目&#xff0c;Amber 项目和Loom 项目中描述了Java主旨。 这篇文章为不熟悉上述项目的人提供了每个项目的简要摘要以及与每个项目相关的一些最新工作…

c语言选择题答案在哪查,C语言选择题及答案

C语言选择题及答案成绩的取得离不开我们平时的努力&#xff0c;以下是百分网小编为大家整理的C语言选择题及答案&#xff0c;希望对大家的学习起到帮助!选择题1.在深度为5的满二叉树叶中&#xff0c;叶子结点的个数为( )。A.32B.31C.16D.152.软件生命周期中&#xff0c;花费最多…

vs2019中如何创建qt项目_在VS2015中创建Qt项目【VS+Qt项目开发系列】(二)

在VS2015中创建Qt项目【VSQt项目开发系列】(二)发布时间&#xff1a;2018-04-20 22:44,浏览次数&#xff1a;1269, 标签&#xff1a;VSQt在上一篇【VSQt项目开发】(一)在VS2015中安装Qt环境中&#xff0c;我们完成了开发环境的安装&#xff0c;现在我们正式创建我们的项目。项目…

c语言ok未定义标识符,C语言中宏的相关知识 - osc_y7ckpzr9的个人空间 - OSCHINA - 中文开源技术交流社区...

2019/04/27 16:02 1.宏的定义&#xff1a;宏定义就是预处理命令的一种&#xff0c;它允许用一个标识符来表示一个字符串。格式如下&#xff1a;#define name(宏名) stuff(字符串)本质就是使用宏名去替代字符串的内容&#xff0c;注意是原封不动的替换&#xff0c;不要自己潜意识…

pythoni屏幕连点_【Flutter组件】仿抖音双击点赞弹出爱心效果(可连点)

效果简介仿抖音点赞手势&#xff0c;单击暂停&#xff0c;双击点赞&#xff0c;可连续点击添加多个爱心&#xff0c;特点如下全部效果为代码绘制(爱心图标来自Material Icon的图标)套上在目标Widget外即可使用提供单击与点赞的回调建议复制代码使用&#xff0c;动画可按需修改没…

java8 linq4j_Java 8仍然需要LINQ吗? 还是比LINQ更好?

java8 linq4j长期以来&#xff0c; LINQ是.NET软件工程生态系统中发生的最好的事情之一。 通过在Visual Studio 2008中引入lambda表达式和monad &#xff0c;它使C&#xff03;语言跃居Java之前&#xff0c;Java在当时是版本6&#xff0c;但仍在讨论泛型类型擦除的优缺点。 这项…

printf sizeof c语言,你可能对 sizeof(i++) 有点误解。。。

原标题&#xff1a;你可能对 sizeof(i) 有点误解。。。各位&#xff0c;今天还是按照惯例给大家分享一个C语言容易出现的小错误&#xff0c;这也是跟sizeof有关的&#xff0c;问题虽小&#xff0c;却可管中窥豹&#xff0c;话不多说&#xff0c;代码先行&#xff1a;# includei…

mongodb上一篇下一篇_如何使用Microsoft office word—上一篇

从这一期开始&#xff0c;将会逐一介绍Microsoft office的几个常用的软件&#xff0c;例如word ppt excel等&#xff0c;每一个软件将分为几期介绍&#xff0c;这几期介绍word。注意&#xff1a;介绍软件版本是Microsoft office365。如何插入图片首先打开word&#xff0c;点击插…

Java:使用Mockito模拟ResultSet

这篇文章展示了如何使用Mockito模拟java.sql.ResultSet 。 它可用于帮助单元测试代码对ResultSet &#xff08;例如ResultSetExtractor &#xff09;执行操作&#xff0c;而无需依赖外部数据源。 您可以通过提供列名列表和2D数据数组来创建MockResultSet 。 例如&#xff1a; …

c语言如何随机获取1kb,基于VS2010+C语言实现播放器的顺序播放、随机播放

1.[文件] music.h ~ 920B 下载(38)/** File: music.h* Time: 2014/10/11*/#ifndef __MUSIC_H__#define __MUSIC_H__typedef enum { UNPLAYED, PLAYED } BOOL; // 自定义一个bool类型typedef enum { ORDER, RANDOM } PLAY_MODEL; // 自定义一个播放类型typedef char *MUSIC_…

rmi远程代码执行漏洞_fastjson远程代码执行漏洞复现

漏洞原理fastjson提供了autotype功能&#xff0c;在请求过程中&#xff0c;我们可以在请求包中通过修改type的值&#xff0c;来反序列化为指定的类型&#xff0c;而fastjson在反序列化过程中会设置和获取类中的属性&#xff0c;如果类中存在恶意方法&#xff0c;就会导致代码执…

c语言编简单博弈小游戏,[2018年最新整理]实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏.doc...

[2018年最新整理]实验二&#xff1a;利用α-β搜索过程的博弈树搜索算法编写一字棋游戏实验二&#xff1a;利用α-β搜索过程的博弈树搜索算法编写一字棋游戏一、实验目的与要求(1)了解极大极小算法的原理和使用方法&#xff0c;并学会用α-β剪枝来提高算法的效率。(2)使用C语…

java中重载 参数顺序_Java方法中的参数太多,第4部分:重载

java中重载 参数顺序期望将过多的参数传递给Java方法的问题之一是&#xff0c;该方法的客户端很难确定它们是否以适当的顺序传递了适当的值。 在以前的文章中&#xff0c;我描述了如何使用自定义类型 &#xff0c; 参数对象和构建器来解决此问题。 解决此问题的另一种方法&…

c语言金箍棒答案,《西游记》阅读测试题(带答案)

《西游记》测试题(后附答案)姓名得分1.《如来佛辨识假猴王》故事中,那只假孙悟空是什么猴子变的&#xff1f;()A&#xff0e;金丝猴 B&#xff0e;石猴 C.六耳猕猴2.金角大王和银角大王原来是()的弟子。A&#xff0e;太上老君 B&#xff0e;孙悟空 C&#xff0e;观音菩萨3.蜘蛛…

五个金念什么_四个“金”字读什么?

展开全部读音为&#xff1a;jīn &#xff0c;是金字的异体字写法&#xff0c;读音和意思与金字完全相同&#xff0c;打不62616964757a686964616fe58685e5aeb931333431353265出来&#xff0c;如下图&#xff1a;金拼音&#xff1a;jīn释义&#xff1a;1.俗称金子。金属元素&am…

Istio的零停机滚动更新

本系列文章的第一部分介绍了如何在Kubernetes集群中实现真正的零停机时间更新。 我们专门解决了将流量从旧实例切换到新实例时出现的请求失败。 本文将展示如何使用Istio群集实现相同的目标。 服务网格技术&#xff08;例如Istio&#xff09;通常与容器编排结合使用。 Istio以…

聚类dbi指数_一种基于DBI-PD聚类算法的异常检测机制

一种基于DBI-PD聚类算法的异常检测机制丁姝郁【期刊名称】《电脑开发与应用》【年(卷),期】2015(000)002【摘要】分析了网络数据维数和检测准确度之间的关系&#xff0c;介绍了常用于入侵检测的聚类分析方法及其优缺点。在此基础上&#xff0c;提出一种以戴维森堡丁指数(DBI)为…

单片机红外通信c语言,基于C语言的计算机与多单片机红外无线串口通信的实现.doc...

基于C语言的计算机与多单片机红外无线串口通信的实现基于C语言的计算机与多单片机红外无线串口通信的实现黄文亮 信息学院 电子信息工程专业指导教师 刘传菊摘要&#xff1a;计算机与一台或多台单片机的通信系统中的数据通讯一般采用的是串行通信方式。串行通信可采用有线与无线…

android 设置资源,Android 资源

Android 资源Android Resources02/01/2018本文内容本文介绍了 Xamarin 中 Android 资源的概念&#xff0c;并介绍了如何使用这些资源。其中介绍了如何使用 Android 应用程序中的资源来支持应用程序本地化和多个设备&#xff0c;包括不同的屏幕大小和密度。This article introdu…

zbrush常用笔刷_ZBrush中常用笔刷综合简介

单击左托盘的笔刷图标&#xff0c;弹出一个笔刷库&#xff0c;其中有许多常用笔刷&#xff0c;这也是许多初学者所头疼的问题&#xff0c;ZBrush的笔刷非常多&#xff0c;而且功能很强大&#xff0c;好多朋友不知道该选择哪一个笔刷进行雕刻。其实&#xff0c;在ZBrush的学习中…