承接上文,分析侧滑效果。我们已经对ContentView(A)做出了分析与大致实现方法。这次,我们去分析背景的实现方式。
在ContentView(A)视图滑动过程中,menuViewController (B)中的视图也有线性的变化,位置大小的线性变化。线性变化值可以参考ContentView(A)线性变化比例。并且有点击屏幕使menuView隐形消失效果。
那既然这样,我们不妨创建一个总视图(D)包含backimageview(C)、menuviewController(B)、以及contentviewController(A)。在分别建立A、B、C视图,作为D的子controller。
所以,在D中,引入menuviewController、 contentviewController , 定义menuviewController * leftMenuViewController, contentviewController
以添加菜单视图为例。
[self.view addSubview:self.menuViewContainer];
self.menuViewContainer.frame = self.view.bounds;
self.menuViewContainer.backgoundColor = [UIColor clearColor];//设置背景色为透明
leftmenuviewController)
{
[self addChildViewController:self.leftMenuViewController]; //作为子Controller;
//设置一些属性
self.leftMenuViewController.view.frame = self.view.bounds;
self.leftMenuViewController.view.background = [UIcolor clearColor];
self.leftMenuViewController.vive.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.menuViewContainer addSubview:self.leftMenuViewController.view];
[self.leftMenuViewController didMoveToParentViewController:self];
}
以此,我们类似的给self.contentViewContainer加载 self.ContentViewController.view
//定义UIPanGestureRecognizer *edgePanGesture
[self.contentViewContainer addGustureRecognizer:edgePanGesture]; //给contentViewContainer添加移动手势。
[self.contentViewContainer addSubview:self.gestureRecognizerView]; //将点击手势区域作为contentView的子视图
//定义点击手势
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGestureRecognizer:)];
[self.gestureRecognizerView addGestureRecognizer:tap];
//滑动contentViewContainer时,可参见上片,contentViewContainer手势方法
- (void)panGestureRecognizer:(UIScreenEdgePanGestureRecognizer *)recognizer{
CGPoint point = [recognizertranslationInView:self.view];
if (recognizer.state ==UIGestureRecognizerStateBegan) {
//添加阴影,在http://www.jianshu.com/p/3a350bb9d9ee下载工程,YQSlideMenuController里有完整步骤,可参考。
}elseif(recognizer.state ==UIGestureRecognizerStateChanged){
float trueDistance = distance + point.x; //实时距离。
//计算上文提到的y与x的关系方法。
//平移与缩放的动画
//判断不同的状态情况,填写不同的平移缩放参数
trueDistance,self.view.center.y); //中心点平移
self.contentViewContainer =CGAffineTransformScale(CGAffineTransformIdentity,y,y); CGAffineTransformScale 缩放方法。
self.menuViewContainer.transform = CGAffinerTransformMakeScale(a,b);
self.menuViewContainer.transform = CGAffinerTransformScale(self.menuViewContainer.transform,m,n);
elseif(recognizer.state ==UIGestureRecognizerStateEnded){
//根据位置做自动停靠,也可结合手势滑动的方向做自动停靠,判断MenuView是否显示的状态。
}
}
//我们应该设置点击时候,有一个判断Menu是否处于显示与隐藏的状态。BOOL menuHidden; 并且在上述滑动手势判断时候,把对应的情况加进去。提供点击方法,在点击中做Menu的显示与隐藏的方法。
-(void)tapGestureRecgnizer:(UITapGextureRecognizer *)recognizer{
if(!self.menuHidden){
[self hideMenu];
}
}
-(void)hideMenu{
if(!self.menuHidden){
[self shoeMenu:NO];
}
}
- (void)shoeMenu:(BOOL)show{
//主要是做显示与隐藏的动画效果,利用UIView animateWithDurantion time animations:^{}方法;
[UIView animateWithDuration:duration aninations:^{
if(show){
self.contentViewContainer.transform = CGAffinerTransformMakeTranslation();
self.contentViewContainer.transform = CGAffinerTransformScela();
self.menuViewContainer.transform = CGAfinerTransformIdentity;
}else{
self.contentViewContainer,transform = CGAffinerTransformIndetity;
self.contentViewScale = 1;
self.menuViewContainer.transform = CGAffineTransformMakeScale();
self.menuViewContainer.transform = CGAffinerTransformTranslate();
}
}completion:^(BOOL finished){
self.menuHidden = !show;
self.gestureRecognizerView.hidden = !show;
}];
}
大致。思路,如此。有些逻辑判断并没有展示出来,以借鉴,以分析,以宽容,以希望与努力。