UINavigationController

2018-12-02  本文已影响0人  Shorebloom_59f6

一、简介

navigationController(导航控制器) 是一种特殊的视图控制器,采用栈的方式来管理普通的UIViewController。,栈底为根视图控制器,用户在场景间切换时,依次将试图控制器压入栈中,且当前场景的试图控制器位于栈顶。要返回上一级,导航控制器将弹出栈顶的控制器,从而回到它下面的控制器。使用导航控制器时必须为其指定一个根视图控制器。

二、属性

// 栈顶VC
@property(nullable, nonatomic,readonly,strong) UIViewController *topViewController; 

// 如果存在模态视图控制器则返回模态视图控制器,否则顶视图控制器。
@property(nullable, nonatomic,readonly,strong) UIViewController *visibleViewController;

// 导航控制器目前栈中所管理的VC 
@property(nonatomic,copy) NSArray<__kindof UIViewController *> *viewControllers;

// 导航栏是否隐藏
@property(nonatomic,getter=isNavigationBarHidden) BOOL navigationBarHidden;

// 导航栏
@property(nonatomic,readonly) UINavigationBar *navigationBar;

// 工具栏是否隐藏, 默认为YES
@property(nonatomic,getter=isToolbarHidden) BOOL toolbarHidden

// 工具栏
@property(null_resettable,nonatomic,readonly) UIToolbar *toolbar

#pragma mark - 手势相关
// 返回手势识别器
@property(nullable, nonatomic, readonly) UIGestureRecognizer *interactivePopGestureRecognizer

// 属性为YES时,当键盘出现时,导航控制器的navigationBar工具栏将被隐藏。当键盘关闭时,这些条将保持隐藏状态,但只要在内容区域轻击一下,就会显示它们。
@property (nonatomic, readwrite, assign) BOOL hidesBarsWhenKeyboardAppears

// 当用户滑动时,导航控制器的导航栏和工具栏将被隐藏(向上滑动)或显示(向下滑动)。工具栏只有在有项目时才参与。
@property (nonatomic, readwrite, assign) BOOL hidesBarsOnSwipe 

// 手势识别器,如果滑动条将隐藏或显示,它将触发该手势识别器。不要更改委托或试图通过覆盖此方法来替换此手势。
@property (nonatomic, readonly, strong) UIPanGestureRecognizer *barHideOnSwipeGestureRecognizer NS_AVAILABLE_IOS(8_0)

// 当UINavigationController的垂直大小类是紧凑的时,隐藏UINavigationBar和UIToolbar。
@property (nonatomic, readwrite, assign) BOOL hidesBarsWhenVerticallyCompact

// 当用户点击时,导航控制器的navigationBar & toolbar将被隐藏或显示,这取决于导航栏的隐藏状态。工具栏只有在有要显示的项目时才会显示。
@property (nonatomic, readwrite, assign) BOOL hidesBarsOnTap

// 手势识别器,用于识别由于内容的点击而隐藏或显示的bar。不要更改委托或试图通过覆盖此方法来替换此手势。
@property (nonatomic, readonly, assign) UITapGestureRecognizer *barHideOnTapGestureRecognizer

三、常用方法

// 推进一个VC (压栈操作)
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;

// 弹出导航控制器所管理的当前VC,返回值为弹出的视图控制器
- (nullable UIViewController *)popViewControllerAnimated:(BOOL)animated; 

// 弹出视图控制器,直到指定的在顶部。返回弹出的控制器。
- (nullable NSArray<__kindof UIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated; 

//  直到堆栈上只剩下一个视图控制器。返回弹出的控制器。
- (nullable NSArray<__kindof UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated;

// 设置导航控制器所管理的VC 数组,如果动画是YES,那么根据新的top视图控制器是否先前在堆栈中模拟push或pop。
- (void)setViewControllers:(NSArray<UIViewController *> *)viewControllers animated:(BOOL)animated

四、代理

// 即将展示视图控制器时调用
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;

// 已经展示视图控制器时调用
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;

// 屏幕旋转时,navigationController 支持的方向,多选
- (UIInterfaceOrientationMask)navigationControllerSupportedInterfaceOrientations:(UINavigationController *)navigationController NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;

/** 子控制器支持的方向
 * UIInterfaceOrientation 枚举类型
 *  1. UIInterfaceOrientationUnknown 设备的朝向不能确定。
 *  2. UIInterfaceOrientationPortrait  该设备处于竖屏模式,设备保持直立,底部的Home键。
 *  3. UIInterfaceOrientationPortraitUpsideDown 该设备处于竖屏模式,但上下颠倒,设备保持直立,顶部的Home键。
 *  4. UIInterfaceOrientationLandscapeLeft 设备处于横向模式,设备保持直立,右侧Home键。
 *  5. UIInterfaceOrientationLandscapeRight 该设备处于横向模式,设备保持直立,左侧Home键。
 */
- (UIInterfaceOrientation)navigationControllerPreferredInterfaceOrientationForPresentation:(UINavigationController *)navigationController NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;

// 自定义 转场 交互式
- (nullable id <UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController
                          interactionControllerForAnimationController:(id <UIViewControllerAnimatedTransitioning>) animationController NS_AVAILABLE_IOS(7_0);

// // 自定义 转场 动画
- (nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                                   animationControllerForOperation:(UINavigationControllerOperation)operation
                                                fromViewController:(UIViewController *)fromVC
                                                  toViewController:(UIViewController *)toVC  NS_AVAILABLE_IOS(7_0);
上一篇下一篇

猜你喜欢

热点阅读