close
当前位置: 物联网在线 > 技术文库 > ios >

NavigationController 已经洗干净了, 就等你来

NavigationController 已经洗干净了, 就等你来

首先来点基础的属性

一. 基本属性

设置颜色

如果项目中 Navigation 都是统一的,而你又懒得单独抽取一个BaseNavigationController,可以直接在 [appDelegate didFinishLaunchingWithOptions]方法中写

//设置NavigationBar背景颜色 [[UINavigationBar appearance] setBarTintColor:[UIColor redColor]]; // 通过富文本设置title 样式(这里也可以通过自定义Label,然后设置 titleView 来实现) [[UINavigationBar appearance] setTitleTextAttributes:@{ NSForegroundColorAttributeName : [UIColor whiteColor] }]; // 设置状态栏格式,如果 NavigationBar 为深色调,就设置为 UIBarStyleBlack,则状态栏显示为白色 [[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

实现 NavigationBar 透明效果

实现透明可能大家第一个想到的是 设置 alpha 值,但是由于设置了作为父控件的 NavigationBar 的透明度后,其子控件 BarButtonItem 也会随之改变,因此想要实现导航栏透明,但是 BarButtonItem 正常显示(类似 手机QQ 的好友动态页),可以采用下面的方法

// 设置一个空的图片背景图片,就能实现导航栏透明但是 BarButtonItem 正常显示 [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];

然而设置之后乍一看没问题,可仔细一看你会发现NavigationBar下面还有一条细线,这个细线就是shadow

NavigationController 已经洗干净了, 就等你来

快看那条淡淡的细线!

NavigationController 已经洗干净了, 就等你来

层级关系图

可通过以下代码来去掉

// 设置一个空的 shadowImage 来实现 self.navigationController.navigationBar.shadowImage = [UIImage new];

那么有同学可能要问了,一直透明的可以通过上述方法来实现,那如果想要随着 上拉距离的改变,实现其透明度动态变化要怎么做?

// 这个就要监听 scrollView 的 offset // 然后获取到 NavigationBar复合视图 的显示子控件,动态改变其透明度 [[self.navigationController.navigationBar subviews] objectAtIndex:0].alpha = 0;

既然讲到这里了就说下来回 push 或 pop,以及使用手势来返回的时候,上下层级之间 NavigationBar 隐藏与否的设置,因为如果这里没处理好的话,会有一个黑条,或者直接显示下一层级的视图,体验特别差,这时候就需要通过动画的方式的在下一层级进行设置

- (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; // 当前 VC 需要显示 navigationBar 就设置为 NO,需要隐藏就设置为 YES [self.navigationController setNavigationBarHidden:YES animated:YES]; }

侧滑手势相关

很多时候,leftBarButtonItem需要自定义,因为默认的显示上一层级的title不一定是我们想要的,但是自定义改变之后,会发现侧滑返回的手势不好使了

NavigationController 已经洗干净了, 就等你来

#warning 这时候就需要在当前 VC 中设置手势代理了 self.interactivePopGestureRecognizer.delegate = self; // 实现代理方法:返回 YES,则手势有效 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { //当导航控制器的子控制器个数 大于1 手势才有效 return self.childViewControllers.count > 1; }

由于项目中同一个 VC,有时候是 modal 出来的,有时候是 push 出来的,那么在这个VC中就要判断进行处理

NSArray *viewcontrollers=self.navigationController.viewControllers; if (viewcontrollers.count > 1) { if ([viewcontrollers objectAtIndex:viewcontrollers.count - 1] == self) { // push方式 [self.navigationController popViewControllerAnimated:YES]; } } else { // present方式 [self dismissViewControllerAnimated:YES completion:nil]; }

如果要实现如下效果的导航栏,设置 leftBarButtonItems 和 rightBarButtonItems 即可

NavigationController 已经洗干净了, 就等你来

喂!焦点在 NavigationBar,老看 tableView 干啥!

关于 rootVC 的 offset,先来看几个 ViewController 的属性

NavigationController 已经洗干净了, 就等你来

iOS7以后默认设置是 UIRectEdgeAll,translucent 的默认值是 true,这个组合会使 rootView 的布局从 (0, 0) 开始,就会造成 rootView 被 NavigationBar 遮挡住一部分,将 edgesForExtendedLayout 设置为 UIRectEdgeNone 即可解决问题

automaticallyAdjustsScrollViewInsets 默认值是 YES,表示在全屏下会自动将 第一个添加到 rootVC 的 ScrollView 的 contentInset 设置为 (64, 0, 0, 0),这样 scrollView 就不会被导航栏遮挡住了

二. 来回跳转

项目中有个需求是A push 到 B, B push 到 C, C pop 到 D,D 再 pop到 A,就好比这样:

NavigationController 已经洗干净了, 就等你来

类似这种交叉跳转的感觉

首先 A push 到 B,直接使用 [self.navigationController pushViewController:B animated:YES]; // 此时 self.navigationController.childViewControllers = [A, B];

然后 B push 到 C,同理 [self.navigationController pushViewController:C animated:YES]; // 此时 self.navigationController.childViewControllers = [A, B, C];


(责任编辑:ioter)

用户喜欢...

三星认为洗衣机也要导入人工智能,洗更快、更干净、更省

三星推出导入QuickDrive洗涤技术的新款洗衣机WW8800M,除了可以更短时间完成洗衣工作,更导入名为Q-rator的人工智能洗...


这台洗衣机用“一杯水”就能把衣服洗干净!创新科技和商业模式,让顾客和厂商双赢

Xeros是一间英国的新创公司,发明了一种洗衣机,只需要一杯水和塑料颗粒,不添加任何洗衣粉,就可以洗衣服!清洗...


担心家里水不干净?BrighTap用物联网帮你把关!

物联网是近年来科技业火红的项目,随着网络传输的进步,已经有越来越多的企业透过物联网开发出许多便利的产品...


没有干净衣服上学 美国每5学童一烦恼

因为根据调查,全美每天不到学校上课的学童多达上千名,而缺课的最主要原因竟然是因为没有干净衣服可穿;不过...


用干净的空气交换免费wifi

在荷兰阿姆斯特丹,街道上的树挂起了smart birdhouses“智能鸟屋”,能监测周围环境的空气质量,若是达到一定的标准...


UINavigationController这一篇就够了

(一)UINavigationController及其相关控件之间的关系 @interface UINavigationController : UIViewController@property(nonatomic,readonly) UINavigationBar *navigationBar;@interface UIViewController (UINavigationControllerItem)@property(nona...


iOS开源 - AREK:干净、易用的 iOS 权限封装库

AREK is a clean and easy to use wrapper over any kind of iOS permission. show a native popup used to avoid to burn the possibility to ask to iOS the real permission show a popup to invite the user to re-enable the permission if it has been denied m...


如何快速干净的测量高速信号

您想在高速信号上进行快速而又比较干净(精确)的测量吗? 没时间把探头尖端焊接到器件上? 不确定高速设计的问题来自哪儿? 这些都是工程师们经常遇到的问题。随着时间压力越来越大,...


测量高速信号快速的、比较干净的测量方法

泰克公司供稿您想在高速信号上进行快速而又比较干净(精确)的测量吗?没时间把探头尖端焊接到器件上?不确定高速...


这个智能坐便器外观复古 一瓶水就能完全冲干净

吃喝拉撒乃人生在世的基本需求,除了要吃好喝好以外,上厕所也同样重要,怎么才能上得更舒服也真是一门不小的...