iOS 類似蝦米音樂側滑動畫解析(2)

    承接上文,分析側滑效果。我們已經對ContentView(A)做出了分析與大致實現方法。這次,我們去分析背景的實現方式。

         觀察,背景,背景圖片在滑動的過程中不變,且有高斯模糊效果。視圖分爲兩部分,上方的是用戶的一些基本信息(頭像,暱稱,郵件圖標,播放次數,關注,粉絲)下面是有tableview編寫的菜單選擇,可上下滑動。在ContentView(A)視圖滑動過程中,menuViewController (B)中的視圖也有線性的變化,位置大小的線性變化。線性變化值可以參考ContentView(A)線性變化比例。並且有點擊屏幕使menuView隱形消失效果。

   那既然這樣,我們不妨創建一個總視圖(D)包含backimageview(C)、menuviewController(B)、以及contentviewController(A)。在分別建立A、B、C視圖,作爲D的子controller。

                                   

        所以,在D中,引入menuviewControllercontentviewController , 定義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;

    }];

 }

     大致。思路,如此。有些邏輯判斷並沒有展示出來,以借鑑,以分析,以寬容,以希望與努力。

     













   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章