承接上文,分析側滑效果。我們已經對ContentView(A)做出了分析與大致實現方法。這次,我們去分析背景的實現方式。
觀察,背景,背景圖片在滑動的過程中不變,且有高斯模糊效果。視圖分爲兩部分,上方的是用戶的一些基本信息(頭像,暱稱,郵件圖標,播放次數,關注,粉絲)下面是有tableview編寫的菜單選擇,可上下滑動。在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 * contentViewController 定義UIview*menuViewContainer(菜單視圖), UIview*contentViewContaioner(內容視圖), UIimageView*backgroundImageView(背景視圖)UIview*gestureRecognizerView(點擊手勢視圖);
以添加菜單視圖爲例。
[self.view addSubview:self.menuViewContainer];
self.menuViewContainer.frame = self.view.bounds;
self.menuViewContainer.backgoundColor = [UIColor clearColor];//設置背景色爲透明
if(self.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的關係方法。
//平移與縮放的動畫
//判斷不同的狀態情況,填寫不同的平移縮放參數
self.contentViewContainer = CGpointMake(self.view.center.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;
}];
}
大致。思路,如此。有些邏輯判斷並沒有展示出來,以借鑑,以分析,以寬容,以希望與努力。