简介

  • 导航控制器UINavigationController可以凭借少量代码,实现在不同界面之间的往返。它提供完整的历史记录控制,自动处理返回和内存,并且无需任何复杂的编码。

  • UINavigationController导航控制器是UIViewController的子类,它维护着一个导航栈型结构。

  • 导航控制器可以作为一个容器来管理其内部的控制器,控制器可以被推入导航栈,也可以被推出。

  • 导航控制器默认显示的是栈顶的控制器。

初始化

- (instancetype)initWithRootViewController:(UIViewController *)rootViewController;

常用属性

  • topViewController:栈顶控制器

  • visibleViewController:当前显示控制器

  • viewControllers:栈内所有控制器

  • navigationBar:导航栏

  • navigationBarHidden:导航栏隐藏状态

  • toolbar:工具栏

  • toolbarHidden:工具栏隐藏状态

  • rootViewController:根视图控制器

界面跳转

每个导航控制器都有一个根视图控制器,从根视图控制器推送到新的视图控制器就会自动构建一个返回按钮。新的视图控制器依然可以继续推送,并且导航控制器会自动记录每个推送,确保每次都能准确地返回上一个控制器。推送到一个视图控制器,会进行界面的控制权移交,但是上一个控制器存在于栈中,不会被释放。

返回上一个控制器会将视图弹出栈,系统会自动释放这部分内存而不需要手动管理(注意,自动释放的前提是编码的时候没有对视图控制器做其他导致retainCount+1的操作,比如添加了NSTimer重复任务)。

推入push

// 推送方法
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; 

推出pop

// 推出方法
// 1、返回到上一个视图控制器
- (nullable UIViewController *)popViewControllerAnimated:(BOOL)animated;// 2、返回到指定视图控制器
- (nullable NSArray<__kindof UIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;// 3、返回到根视图控制器
- (nullable NSArray<__kindof UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated;

Tips:

一个控制器只能返回它的推送历史中存在的控制器,如果不在这个推送的历史记录中,即使他们拥有同一个根视图控制器,也无法返回。

导航控制器与视图控制器的推送关系可以用下图描述:

导航栏 UINavigationBar

导航栏高度64 = 导航栏(44) + 状态栏(20);

导航栏的translucent属性会直接影响屏幕坐标系原点。如果导航栏透明(值为YES),控制器视图坐标系原点默认位置在屏幕左上角,即{0,0}点位置;导航栏不透明(值为NO),控制器视图坐标系原点相对屏幕左上角在Y轴向下偏移64个像素,即{0, 64}点位置。

常用属性

  • barTintColor:背景颜色

  • tintColor:模板色

  • translucent:是否半透明

  • titleTextAttributes:标题属性

// 系统键:
// 1、NSFontAttributeName:字体
// 2、NSShadowAttributeName:阴影
// 3、NSForegroundColorAttributeName:字体颜色navigationController = @{NSFontAttributeName : [UIFont boldSystemFontOfSize:20],NSForegroundColorAttributeName : [UIColor whiteColor]};
  • self.navigationItem.titleView:标题视图

Tips

导航栏以及状态栏全部透明的方法,请点击这里,全透明方法是基于Swift实现,对于没有Swift编程基础的开发者可参考转换成OC。

工具栏 UIToolbar

工具栏默认隐藏,要显示工具栏,需将toolbarHidden属性置为YES;

常用属性

  • barTintColor:背景颜色

  • tintColor:模板色

  • translucent:是否半透明

UIBarButtonItem

导航栏、工具栏按钮元素。

初始化

// 1、图片初始化item
- (instancetype)initWithImage:(UIImage *)image style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action;// 2、标题初始化item
- (instancetype)initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action;// 3、系统初始化item
- (instancetype)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:(id)target action:(SEL)action;// 4、自定义初始化item
- (instancetype)initWithCustomView:(UIView *)customView;

添加item

导航栏:

// 导航栏左边
self.navigationItem.leftBarButtonItem = item
self.navigationItem.leftBarButtonItems = @[item1, item2, item3...]// 导航栏右边
self.navigationItem.rightBarButtonItem = item
self.navigationItem.rightBarButtonItems = @[item1, item2, item3...]

工具栏:

self.toolbarItems = @[item1, item2, item3...]

自定义返回按钮

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"自定义返回按钮"style:UIBarButtonItemStylePlaintarget:nilaction:nil];
self.navigationItem.backBarButtonItem = item// 如果想要隐藏某一个视图控制器中的返回按钮,则到当前控制器执行如下方法:
self.navigationItem.hidesBackButton = YES;

Tips

当前控制器的返回按扭需要到上一个视图控制器自定义,比如从Nav1 push -> Nav2,Nav2的返回按钮需要到Nav1中去自定义;

常用方法

1、入栈隐藏工具栏

self.hidesBottomBarWhenPushed = YES;

2、设置导航栏、工具栏背景图片

- (void)setBackgroundImage:(UIImage *)backgroundImage forBarPosition:(UIBarPosition)barPosition barMetrics:(UIBarMetrics)barMetrics

OCUI界面设计:导航控制器相关推荐

  1. OCUI界面设计:UIPickerView 拾取视图

    简介 UIPickerView 是一个选择器控件, 它可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观,因此用法非常灵活. UIPickerView 直接继承了 UIV ...

  2. IOS开发-表视图LV3导航控制器

    学到这里感觉有点难了,其实这篇文章再草稿箱里放了好久了~ 最近对于学习的热情下降了.这不行-抓紧学习走起! 在这一章节的学习中主要针对导航控制器及表视图来建立多视图的应用, 首先要了解一些概念-- 1 ...

  3. iphone开发导航控制器的使用

    一. 导航控制器总述: UINavigationController是用于构建分层应用程序的主要工具,主要采用栈形式来实现视图.任何类型的视图控制器都可放入栈中.在设计导航控制器时需要指定根视图即用户 ...

  4. iOS 中导航控制器全屏向右滑动返回上一界面

    在iOS中,导航控制器默认就自带了侧滑功能,当用户在界面的左边(左边边缘)滑动的时候,才会有侧滑功能.但是我们往往在开发的过程中需要在屏幕的任意位置滑动,都需要返回到上一个界面. 多说无意,直接看代码 ...

  5. Android典型界面设计(3)——访网易新闻实现双导航tab切换

    一.问题描述 双导航tab切换(底部区块+区域内头部导航),实现方案底部区域使用FragmentTabHost+Fragment, 区域内头部导航使用ViewPager+Fragment,可在之前博客 ...

  6. UI素材模板|app ui界面的导航设计都有哪些?

    导航的使命就在于自身的"名称"上面,它叫什么名字就是在告诉用户"沿着这条路能通往哪里",所以导航的展示形式虽然多种多样,却大多逃不出文字的辅佐,这是因为它的本质 ...

  7. 【产品】《用户体验要素》框架层(界面设计、导航设计和信息设计)

    框架层--界面设计.导航设计和信息设计 界面设计:确定框架,提供给用户做某些事的能力. 导航设计:呈现信息的一种界面形式,提供给用户去某个地方的能力. 信息设计:呈现有效的信息沟通,传达想法给用户. ...

  8. android 界面大小设置在哪里,移动应用界面设计的尺寸设置及规范

    刚接触移动应用的界面设计,最先跳入脑海的疑问是:画布尺寸设计多大(特别是Android).图标和字体大小怎么定.需要设计多套设计稿么.如何切图以配合开发的实现? 本篇将结合iOS和android官方的 ...

  9. 移动应用界面设计的尺寸规范

    移动应用的界面设计画布尺寸设计多大(特别是Android).图标和字体大小怎么定.需要设计多套设计稿么.如何切图以配合开发的实现? 本篇将结合iOS和android官方的设计规范.搜集的资料以及工作中 ...

  10. Python-Tkinter图形化界面设计(详细教程 )

    原文链接:https://www.jianshu.com/p/91844c5bca78 声明:本篇文章为转载自https://www.jianshu.com/p/91844c5bca78,在原作者的基 ...

最新文章

  1. lua metatable 和 _index 实验
  2. 如何正确入门Windows系统下驱动开发领域?
  3. MySQL的CRUD操作+使用视图
  4. TCP解决粘包问题(结构数据封包拆包)
  5. hdu 3037 Lucas定理
  6. 如何导出android studio程序,(技术)聊聊Android Studio 如何生成Jar
  7. 【EXLIBRIS】纸版书目整理 -- 小书架 下/床头柜/书箱 【100 种】【108 册】
  8. 天国近了(一) -- 揭穿OOP神话
  9. EF DbContext.Configuration.ProxyCreationEnabled 什么鬼?
  10. 对讲机写频软件通用版_数字对讲机常规调频方法
  11. git中如何获取远程仓库的最新代码?
  12. Xperf 使用方法
  13. 我的web前端工作日记2------web前端工作的一天
  14. 蓝天热键驱动_创建快捷方式或热键以立即弹出特定的USB驱动器
  15. mac 解压rar压缩文件
  16. 数据库界的《延禧攻略》来了,不看你就输了
  17. 【读书笔记】金字塔原理-构建金字塔的逻辑顺序
  18. Silverlight杂记Media和SMF播放控件推荐
  19. Android Sensor感应器介绍,获取用户移动方向,指南针原理
  20. 【干货】蚂蚁前端研发最佳实践

热门文章

  1. @@identity
  2. c#字符串的格式化输出
  3. postgresql.conf log_rotation_size
  4. 雷军:《我十年的程序员生涯》系列之二:我赚的第一桶金
  5. 【SDOI2015】星际战争(网络流)
  6. 放量跌与缩量跌的区别是什么?
  7. 基于牛顿冷却定律的时间衰减函数模型
  8. dubbo SPI机制与@Adaptive自适应扩展机制
  9. 游戏3C之二——镜头
  10. Carlife Iphone IAP2连接与认证过程