iOS开发UINavigation系列四——导航控制器UINavigationController

iOS开发UINavigation系列四——导航控制器UINavigationController

一、引言

        在前面的博客中,我么你介绍了UINavigationBar,UINavigationItem和UIToolBar,UINavigationController是将这些控件和UIViewController紧密的结合了起来,使用导航,我们的应用程序层次会更加分明,对controller的管理也更加方便。前几篇博客地址如下:

UINavigationBar:http://my.oschina.net/u/2340880/blog/527706

UINavigationItem:http://my.oschina.net/u/2340880/blog/527781

UIToolBar:http://my.oschina.net/u/2340880/blog/528168

二、导航控制器的创建和controller的管理

        导航控制器是一个堆栈结构,只是其中管理的对象是controller,通过push与pop进行controller的切换,我们有两种方式可以创建导航控制器:

?


1

2

3

4

//通过一个自定义的导航栏和工具栏创建导航控制器

- (instancetype)initWithNavigationBarClass:(nullable Class)navigationBarClass toolbarClass:(nullable Class)toolbarClass;

//使用系统默认的导航栏和工具栏,通过一个根视图创建导航控制器

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

通过以下方法对视图控制器进行管理操作:

?


1

2

3

4

5

6

7

8

9

10

//设置管理的视图控制器

- (void)setViewControllers:(NSArray<UIViewController *> *)viewControllers animated:(BOOL)animated;

//压入新的视图控制器

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;

//弹出一个视图控制器 返回的是pop的controller

- (nullable UIViewController *)popViewControllerAnimated:(BOOL)animated;

//弹出到某个视图控制器 返回所有pop的controller

- (nullable NSArray<__kindof UIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated; 

//直接pop到根视图控制器,返回所有被pop的controller

- (nullable NSArray<__kindof UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated;

三、导航控制器中的常用方法和属性

?


1

2

3

4

//返回栈顶的controller

@property(nullable, nonatomic,readonly,strong) UIViewController *topViewController; 

//返回显示的controller

@property(nullable, nonatomic,readonly,strong) UIViewController *visibleViewController;

上面两个方法的区别在于,topViewController是返回被push出的最后一个controller,但是如果之后又有present进行莫泰跳转,visibleViewController会返回当前显示的controller。例如A-push-B-present-C,则topViewController会返回B,visibleViewController会返回C。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

//返回堆栈中所有的controller

@property(nonatomic,copy) NSArray<__kindof UIViewController *> *viewControllers;

//设置隐藏导航栏

@property(nonatomic,getter=isNavigationBarHidden) BOOL navigationBarHidden;

- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated;

//导航栏对象,只读属性

@property(nonatomic,readonly) UINavigationBar *navigationBar;

//隐藏状态栏

@property(nonatomic,getter=isToolbarHidden) BOOL toolbarHidden NS_AVAILABLE_IOS(3_0);

- (void)setToolbarHidden:(BOOL)hidden animated:(BOOL)animated;

//状态栏对象

@property(null_resettable,nonatomic,readonly) UIToolbar *toolbar;

//导航中的返回手势对象

//iOS7之后,在导航中右划会进行pop操作,设置这个的enable可以控制设置手势是否失效

@property(nullable, nonatomic, readonly) UIGestureRecognizer *interactivePopGestureRecognizer;

四、iOS8后导航的新特性

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

//这个方法是为了iOS方法的命名统一,在导航中,其作用和push一样

- (void)showViewController:(UIViewController *)vc sender:(nullable id)sender;

//弹出键盘的时候隐藏导航栏

@property (nonatomic, readwrite, assign) BOOL hidesBarsWhenKeyboardAppears;

//屏幕滑动的时候隐藏导航栏,常用于tableView,上滑隐藏导航栏,下滑显示,带动画效果

@property (nonatomic, readwrite, assign) BOOL hidesBarsOnSwipe;

//滑动隐藏导航栏的手势

@property (nonatomic, readonly, strong) UIPanGestureRecognizer *barHideOnSwipeGestureRecognizer;

//横屏的时候隐藏导航栏

@property (nonatomic, readwrite, assign) BOOL hidesBarsWhenVerticallyCompact;

//敲击屏幕可以隐藏与显示导航栏

@property (nonatomic, readwrite, assign) BOOL hidesBarsOnTap;

//敲击屏幕的手势

@property (nonatomic, readonly, assign) UITapGestureRecognizer *barHideOnTapGestureRecognizer;

iOS8中增加的这些方法,不得不说着实在用户体验生进了一大步,从中也可以看出apple对于用户体验度的用心。

五、UINavigationDelegate

        导航控制器还提供了一些代理回调方法,如下:

?


1

2

3

4

5

6

7

8

9

10

11

//视图将要展示时调用的方法

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;

//视图已经展示时调用的方法

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;

//设置方法设置导航控制器支持的设备方向

- (UIInterfaceOrientationMask)navigationControllerSupportedInterfaceOrientations:(UINavigationController *)navigationController NS_AVAILABLE_IOS(7_0);

//这个方法设置导航控制器的首选设备方向

- (UIInterfaceOrientation)navigationControllerPreferredInterfaceOrientationForPresentation:(UINavigationController *)navigationController NS_AVAILABLE_IOS(7_0);

//下面两个方法可以对导航的转场动画进行设置

- (nullable id <UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController interactionControllerForAnimationController:(id <UIViewControllerAnimatedTransitioning>) animationController;

- (nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC ;

六、与UIViewController相关

        当一个controller被添加到导航中后,系统会为它分配一些属性,如下:

?


1

2

3

4

5

6

//当前controller对应的导航项

@property(nonatomic,readonly,strong) UINavigationItem *navigationItem;

//push的时候隐藏底部栏,如push后隐藏tabbar

@property(nonatomic) BOOL hidesBottomBarWhenPushed;

//管理它的导航控制器

@property(nullable, nonatomic,readonly,strong) UINavigationController *navigationController;

    

时间: 2024-08-29 22:00:12

iOS开发UINavigation系列四——导航控制器UINavigationController的相关文章

iOS开发UINavigation系列一——导航栏UINavigtionBar

iOS开发UINavigation系列一--导航栏UINavigtionBar 一.导航栏的使用         在iOS开发中,我们通常会使用导航控制器,导航控制器中封装了一个UINavigationBar,实际上,我们也可以在不使用导航控制器的前提下,单独使用导航栏,在UINavigationBar中,也有许多我们可以定制的属性,用起来十分方便. 二.UINavigationBar的创建和风格类型         导航栏继承于UIView,所以我们可以像创建普通视图那样创建导航栏,比如我们创

iOS开发UINavigation系列二——UINavigationItem

iOS开发UINavigation系列二--UINavigationItem 一.引言         UINavigationItem是导航栏上用于管理导航项的类,在上一篇博客中,我们知道导航栏是通过push与pop的堆栈操作来对item进行管理的,同样,每一个Item自身也有许多属性可供我们进行自定制.这篇博客,主要讨论UINavigationItem的使用方法. UINavigationBar:http://my.oschina.net/u/2340880/blog/527706. 二.来

iOS开发UINavigation系列三——工具栏UIToolBar

iOS开发UINavigation系列三--工具栏UIToolBar         iOS中除了UINavinationBar之外,还有工具栏UIToolBar可以供我们使用,工具栏和导航栏十分类似,只是功能更加简单,工具栏中也有UIBarButtonItem按钮,在前两篇博客中,对导航栏和导航项都进行的讨论,地址如下: UINavigationBar:http://my.oschina.net/u/2340880/blog/527706 UINavigationItem:http://my.

iOS流布局UICollectionView系列四——自定义FlowLayout进行瀑布流布局

iOS流布局UICollectionView系列四--自定义FlowLayout进行瀑布流布局 一.引言         前几篇博客从UICollectionView的基础应用到设置UICollectionViewFlowLayout更加灵活的进行布局,但都限制在系统为我们准备好的布局框架中,还是有一些局限性,例如,如果我要进行瀑布流似的不定高布局,前面的方法就很难满足我们的需求了,如下: 这种布局无疑在app的应用中更加广泛,商品的展示,书架书目的展示,都会倾向于采用这样的布局方式,当然,通过

ios中带TabBar的导航控制器,自定义右滑手势返回

问题描述 ios中带TabBar的导航控制器,自定义右滑手势返回 右滑返回上一级页面时,tabBar不能紧贴着第一级页面,而是浮在最上层 解决方案 看不明白是什么情况...看不明白是什么情况...看不明白是什么情况...看不明白是什么情况...看不明白是什么情况...看不明白是什么情况...

IOS开发之视图和视图控制器

        视图(View), 视图控制器(ViewController)是IOS开发UI部分比较重要的东西.在学习视图这一块的东西的时候,感觉和Java Swing中的Panel差不多.在UIKit框架中都有一个UIWindow来容纳我们的View.应用程序中几乎全部的可视控件都是UIView以及UIView的子类的实例,并且UIWindow也是UIView的子类.UIWindow可以不借助于父类视图显示在屏幕上,其余的视图都需要添加到父视图中才能显示.窗口是用来显示视图的,下面我们将会结

IOS开发:Web App导航设计探讨

 开发:Web App导航设计探讨-app导航设计"> 导航系统所遭遇的挑战 iPhone Native App较常见的导航如下图所示: 手机屏幕底端:A.B.C.D四个tab组成该Native App的全局导航,这是我们经常见到的tab导航栏. 手机屏幕顶端:主要有四种形式.第①种形式是在该位置中心显示产品的logo;也可以将logo适当调整位置,将常用操作或快捷入口放在该位置的右侧.第②种形式是在该位置有两或三个tab选项.第③种形式是在该位置中间显示当前任务标题,在左右两侧放置导航控

ios开发-如何改变一个视图控制器中除一个控件变灰

问题描述 如何改变一个视图控制器中除一个控件变灰 就像图片一样,当选择器触发时,其余控件色变成灰色怎么实现?求大神开发-如何改变一个视图控制器中除一个控件变灰-ios 添加子视图控制器">

iOS开发之如何修改导航栏的内容

导航栏的内容由栈顶控制器的navigationItem属性决定. UINavigationItem有以下属性影响着导航栏的内容(通常在子控制器中viewDidLoad方法中调用这些方法): 左上角的返回按钮: @property(nonatomic,retain) UIBarButtonItem *backBarButtonItem; 例如:self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle