美文网首页ios技术
关于导航控制器的分享心得

关于导航控制器的分享心得

作者: 当优秀成为习惯 | 来源:发表于2017-07-20 11:43 被阅读1次

    关于侧滑

    • 方法1(一行代码搞定)
      self.interactivePopGestureRecognizer.delegate = nil;
    • 方法2 (不推荐使用太麻烦)
    -(void)setGestrue{
        // 获取系统自带滑动手势的target对象
        id target = self.interactivePopGestureRecognizer.delegate;
        // 创建全屏滑动手势,调用系统自带滑动手势的target的action方法
        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
        // 设置手势代理,拦截手势触发
        pan.delegate = self;
        // 给导航控制器的view添加全屏滑动手势
        [self.view addGestureRecognizer:pan];
        // 禁止使用系统自带的滑动手势
        self.interactivePopGestureRecognizer.enabled = NO;
    }
    
    // 什么时候调用:每次触发手势之前都会询问下代理,是否触发。
    // 作用:拦截手势触发
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
    {
        // 注意:只有非根控制器才有滑动返回功能,根控制器没有。
        // 判断导航控制器是否只有一个子控制器,如果只有一个子控制器,肯定是根控制器
        if (self.childViewControllers.count == 1) {
            // 表示用户在根控制器界面,就不需要触发滑动手势,
            return NO;
        }
        return YES;
    }
    

    关于系统的一些方法

    /**
     * 可以在这个方法中拦截所有push进来的控制器
     */
    - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
        if (self.childViewControllers.count > 0) { // 如果push进来的不是第一个控制器
            UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
            [button setTitle:@"返回" forState:UIControlStateNormal];
            [button setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal];
            [button setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted];
            button.size = CGSizeMake(70, 30);
            // 让按钮内部的所有内容左对齐
            button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
    //        [button sizeToFit];
            // 让按钮的内容往左边偏移10
            button.contentEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0);
            [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
            [button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
            [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
            
            // 修改导航栏左边的item
            viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
            
            // 隐藏tabbar
            viewController.hidesBottomBarWhenPushed = YES;
        }
        
        // 这句super的push要放在后面, 让viewController可以覆盖上面设置的leftBarButtonItem
        [super pushViewController:viewController animated:animated];
        
    }
    
    

    第一次使用这个类的时候会调用一次(可以做一些初始化的操作)

    + (void)initialize
    {
        // 当导航栏用在XMGNavigationController中, appearance设置才会生效
    //    UINavigationBar *bar = [UINavigationBar appearanceWhenContainedIn:[self class], nil];
        UINavigationBar *bar = [UINavigationBar appearance];
        [bar setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault];
        [bar setTitleTextAttributes:@{NSFontAttributeName : [UIFont boldSystemFontOfSize:20]}];
        
        // 设置item
        UIBarButtonItem *item = [UIBarButtonItem appearance];
        // UIControlStateNormal
        NSMutableDictionary *itemAttrs = [NSMutableDictionary dictionary];
        itemAttrs[NSForegroundColorAttributeName] = [UIColor blackColor];
        itemAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:17];
        [item setTitleTextAttributes:itemAttrs forState:UIControlStateNormal];
        // UIControlStateDisabled
        NSMutableDictionary *itemDisabledAttrs = [NSMutableDictionary dictionary];
        itemDisabledAttrs[NSForegroundColorAttributeName] = [UIColor lightGrayColor];
        [item setTitleTextAttributes:itemDisabledAttrs forState:UIControlStateDisabled];
    }
    

    相关文章

      网友评论

        本文标题:关于导航控制器的分享心得

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