美文网首页
UINavigationController

UINavigationController

作者: Shorebloom_59f6 | 来源:发表于2018-12-02 19:42 被阅读0次

    一、简介

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

    相关文章

      网友评论

          本文标题:UINavigationController

          本文链接:https://www.haomeiwen.com/subject/gxzjcqtx.html