第一步,隐藏导航栏底部的分割线

如何隐藏导航栏底部的分割线(shadow image/ hairline)?

    navigationBar.clipsToBounds = YES;    //隐藏
navigationBar.clipsToBounds = NO; //显示

因为分割线是显示在导航栏外部的,已经超过了导航栏的高度,通过 [UIView setClipsToBounds:bool] 决定是否显示 View frame 之外的部分。

也可以根据这个分割线的特性获取 Ta 这个 View,然后通过 [UIView setHidden:hidden] 方法控制是否需要显示。

首先,Ta 是个一个 UIImageView, 并且 Ta 的 height 不大于 1:

- (UIImageView *)findHairlineFromView:(UIView *)view
{
if ([view isKindOfClass:[UIImageView class]] && view.frame.size.height <= 1.0) {
return (UIImageView *)view;
} for (UIView *subView in view.subviews) {
UIImageView *imageView = [self findHairlineFromView:subView];
if (imageView) {
return imageView;
}
} return nil;
}
//在 viewDidLoad 方法中获取 hairline
hairlineView = [self findHairlineFromView:self.navigationController.navigationBar]; //在 viewWillAppear:
[hairlineView setHidden:YES]; //在 viewWillDisappear:
[hairlineView setHidden:NO];

第二部,增加导航栏的“高度”

如果注意观察 apple 的官方应用,如 “日历” 或 “App Store”,会发现这其实不是一个导航栏 (NavigationBar),而是自定义的导航栏恰好顶在系统的导航栏下面,看起来好像一个。实际上是两个导航栏的合体。

如果只是改变系统导航栏的 Frame,会发现导航栏上 UIBarButtonItem 和 Title 始终都会挨着导航栏的下沿。所以,就考虑通过上面的方法实现。

先初始化一个自定义导航栏:

self.customNavigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(, , self.view.bounds.size.width, )];
self.customNavigationBar.delegate = self;
[self.view addSubview:self.customNavigationBar];

实现 <UINavigationBarDelegate> 中的方法

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
{
return UIBarPositionTopAttached;
}

效果:

链接:http://stackoverflow.com/a/21999916

iOS7以上: 实现如“日历”的 NavigationBar的更多相关文章

  1. 使用Base SDK 6.1编译的APP在iOS7的设备上运行,NavigationBar覆盖view的解决办法

    if (__IPHONE_OS_VERSION_MAX_ALLOWED <= __IPHONE_6_1) { self.navigationController.navigationBar.tr ...

  2. 关于iOS7 设计师需要了解的十件事

    在今年的WWDC上,苹果推出了采用全新设计语言打造的iOS7.新系统弃用了诸如皮革.木质一类的伪3D拟真效果,取而代之的是更加简洁轻量的设计路线,其中文字排版成了重头戏,另外在某些方面也受到了扁平化设 ...

  3. 怎么让self.view的Y从navigationBar下面开始计算

    原文地址 http://blog.sina.com.cn/s/blog_1410870560102wu9a.html 在iOS 7中,苹果引入了一个新的属性,叫做[UIViewController s ...

  4. iOS 在viewDidLayoutSubviews自动布局crash问题

    1 viewDidLayoutSubviews改成viewWillLayoutSubviews在iOS7上就不会crash了2 viewDidLoad中还需要设置self.edgesForExtend ...

  5. view向全屏延伸时的属性设置

    从iOS7 开始,当视图被navigationbar和tabbar包裹时,view默认会延伸到状态bar下面, 1.如果要让view贴着上下的状态bar展示,可以在viewDidLoad中设置属性 s ...

  6. iOS7之后设置NavigationBar的背景

    iOS7之后,请注意需要使用setBarTintColor ``` [self.navigationController.navigationBar setBarTintColor:[UIColor ...

  7. 开源日历TimesSquare在iOS7下诡异渲染的解决办法

    因为没有时间自己写一个日历,所以暂时使用了一个三方的日历https://github.com/square/objc-TimesSquare 但是在iOS7下.突然产生了一个诡异的BUG..如下图: ...

  8. ios7 tableview被navigationbar挡住

    用ego下拉刷新的时候,每次在ios7时,tableview都会上移...导致被navagationbar挡住.ios6是正常的,于是在init的时候添加如下代码... NSComparisonRes ...

  9. iOS7自定义statusbar和navigationbar的若干问题

    当然有许多问题是这篇文章中没有提到的,按照文章的方法进行设置,你可能会遇到以下问题: 1.navigationbar的背景图片自定义以后,statusbar虽然和navigationbar共用了背景图 ...

随机推荐

  1. IBM ILOG JViews Charts 产品及功能介绍

    摘抄连接:http://www.ibm.com/developerworks/cn/websphere/library/techarticles/1004_lidb_ilogjchart/ IBM I ...

  2. Android studio 创建安卓项目hello

    Android studio是一个非常好用的软件,只不过在使用的最开始,由于各种问题,会失败,并且新手本身就不懂的情况下,更加的懵逼. 这里我来记录一下我遇到过的一点坑. 首先,Android stu ...

  3. [转]最全的用正则批量去除Teleport Pro整站下载文件冗余代码

    原文地址:http://www.jb51.net/article/43650.htm html原文件中tppabs标记是Teleport Pro软件留下的标记.该软件是离线浏览器,下载完整个网页后,它 ...

  4. Swift is Now Open Source

    https://developer.apple.com/news/?id=12032015a Swift is Now Open Source December 3, 2015 Join the op ...

  5. java.io.BufferedInputStream 源码分析

    BufferedInputStream是一个带缓冲区的输入流,在读取字节数据时可以从底层流中一次性读取多个字节到缓冲区,而不必每次读取操作都调用底层流,从而提高系统性能. 先介绍几个关键属性 //默认 ...

  6. 如何在CentOS 6.5上升级PHP

    CentOS 6.5上默认安装PHP 5.3.因为后台网站无法正确运行在PHP 5.3上,所以计划将PHP升级到开发平台一样的版本PHP 5.5.为了方便,我们采用YUM的方式升级PHP 工具/原料 ...

  7. 如何让其他机器访问你的oracle数据库

    修改listen.ora SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = CLRExtProc) (ORACLE_HOME = E:\a ...

  8. MSSQL跨服务器查询

    1.因为此功能服务器安全配置的一部分而被关闭,所以我们先开启 reconfigure reconfigure 2.如果需要关闭,执行 reconfigure reconfigure 3.查询语句 SE ...

  9. Ubuntu16.04怎么将桌面左侧的启动器移动到屏幕底部

    与其他 Linux 发行版不同,Ubuntu 多年来一直使用 Unity 做桌面环境,该环境的最突出特点就是桌面左侧有一个启动器栏(Launcher).从 16.04 版本开始,Ubuntu 提供了一 ...

  10. SpringBoot 无法显示html文件 找不到html文件 如果显示html文件

    两种情况: 1.如果使用了 thymeleaf 模板引擎,html文件可以放在 template文件夹中,如果不是一定不要放进去,否则找不到,因为html是静态页面,所以放在把此类文件放在了stati ...