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);