iOS7以上: 实现如“日历”的 NavigationBar
2024-09-08 15:55:25
第一步,隐藏导航栏底部的分割线
如何隐藏导航栏底部的分割线(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
最新文章
- python 异常处理学习笔记
- node.js 基础学习笔记2
- ZOJ 3157 Weapon
- C++和pascal之间的通信
- android生成验证码bitmap
- RejexLib
- GCD其他实用场景
- MountService初探
- 数据库并行读取和写入(Python实现)
- 大数据(1):基于sogou.500w.utf8数据的MapReduce程序设计
- PAT1032: Sharing (25)
- Hankson 的趣味题
- spring boot + dubbo开发遇到过的异常
- 【iCore4 双核心板_ARM】例程十五:USB_CDC实验——高速数据传输
- git 提交去除每次输账号密码
- 推荐:Java性能优化系列集锦
- 如何在Twitter开发者平台上注册自己的应用
- 【OCP 12c】最新CUUG OCP-071考试题库(61题)
- HCNP - Server
- linux开发node相关的工具