美文网首页
如何自定义以一个侧滑视图控制器

如何自定义以一个侧滑视图控制器

作者: bonoCat | 来源:发表于2016-04-20 13:04 被阅读173次

之前说了Container View Controller,可以基于它来做一个简单的侧滑视图控制器。

基本思路是在一个Container 中添加两个 UIviewController


    - (void)configSideWithLeftViewController:(UIViewController *)leftVC contentViewController:(UIViewController *)contentVC
    {
    self.leftViewController    = leftVC;
    self.contentViewController = contentVC;

    [self addChildViewController:_leftViewController];
    [self addChildViewController:_contentViewController];
    
    [self.view addSubview:_leftViewController.view];
    [self.view addSubview:_contentViewController.view];
    
    [_leftViewController didMoveToParentViewController:self];
    [_contentViewController didMoveToParentViewController:self];

    
    [_contentViewController.view mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self.view);
    }];
    
    
    [_leftViewController.view mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self.view);
    }];
    
    [self addPanGesInView:_contentViewController.view];
    }

接下来就是添加手势控制


    - (void)handlePanGestures:(UIPanGestureRecognizer *)ges
    {
    CGPoint translation = [ges translationInView:_contentViewController.view];
    
    CGFloat x = [_contentViewController.view center].x + translation.x;
    
    x = MIN(GOScreenWidth / 2.0 + GOScreenWidth - _lSpace, x);
    
    x = MAX(x, GOScreenWidth / 2.0);
    
    switch (ges.state) {
        case UIGestureRecognizerStateBegan:
        {
        
        }
            
            break;
        case UIGestureRecognizerStateChanged:
        {
            
            [_contentViewController.view mas_remakeConstraints:^(MASConstraintMaker *make) {
                
                make.top.mas_equalTo(0);
                make.leading.mas_equalTo(x - GOScreenWidth / 2.0);
                make.width.mas_equalTo(320);
                make.bottom.mas_equalTo(0);
                
            }];
            
            [ges setTranslation:CGPointZero inView:_contentViewController.view];
            
        }
            break;
        case UIGestureRecognizerStateEnded:
        {
            if (_sideCurrentStatus == SideStatusOpen)
            {
                if (x - GOScreenWidth / 2.0 < GOScreenWidth - _lSpace - 100) {
                    [self closeLeftSide];
                }
                else
                {
                    [self openLeftSide];
                }
            }
            else
            {
                if (x - GOScreenWidth / 2.0 > 50) {
                    [self openLeftSide];
                }
                else
                {
                    [self closeLeftSide];
                }
            }
        }
            break;
        default:
            break;
    }
    }


    - (void)openLeftSide
    {
    [self.view setNeedsUpdateConstraints];
    [self.view updateConstraintsIfNeeded];

    [_contentViewController.view mas_remakeConstraints:^(MASConstraintMaker *make) {
        
        make.top.mas_equalTo(0);
        make.leading.mas_equalTo(GOScreenWidth - _lSpace);
        make.width.mas_equalTo(320);
        make.bottom.mas_equalTo(0);
        
    }];
    
    [self leftViewControllerWillAppear];
    
    
    [UIView animateWithDuration:0.3 animations:^{
        [self.view layoutIfNeeded];

    }completion:^(BOOL finished) {
        
        [self leftViewControllerDidAppear];
        
        // 放在最后
        _sideCurrentStatus = SideStatusOpen;

    }];
    }

    - (void)closeLeftSide
    {
    [self.view setNeedsUpdateConstraints];
    [self.view updateConstraintsIfNeeded];
    
    [self leftViewControllerWillDissAppear];
    
    [_contentViewController.view mas_remakeConstraints:^(MASConstraintMaker *make) {
        
        make.top.mas_equalTo(0);
        make.leading.mas_equalTo(0);
        make.width.mas_equalTo(320);
        make.bottom.mas_equalTo(0);
        
    }];
    
    
    [UIView animateWithDuration:0.3 animations:^{
        
        [self.view layoutIfNeeded];
        
    }completion:^(BOOL finished) {
        
        [self leftViewControllerDissAppear];
        
        _sideCurrentStatus = SideStatusClose;

    }];
    
    }
 这样子我们在实现不同的动画效果的时候,只需要修改
    - (void)handlePanGestures:(UIPanGestureRecognizer *)ges
就可以了。




代码[在这里](https://github.com/dingdingtion/CustomSideViewController)

相关文章

网友评论

      本文标题:如何自定义以一个侧滑视图控制器

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