之前说了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)
网友评论