2012-06-29 104 views
2

我正在使用自定義控制器進行轉換(無法使用導航控制器,這是由於項目中的固有周期,導致導航控制器堆棧無限增長[我認爲會導致內存問題])。我正在使用UIView animateWithDuration模擬導航控制器滑動動畫(當轉換到新屏幕時):動畫:完成:GMGridView出現在屏幕外,但與屏幕視圖重疊

當按下觸發轉換的按鈕時,我想要轉換的新視圖的框架設置爲一個屏幕外的位置。在用於過渡的動畫(UIView animateWithDuration:動畫:完成:)中,當前在屏幕上的視圖將其框架設置爲離屏位置,並且將新視圖設置爲屏幕上的位置。

這是我的自定義控制器內部的轉換:

CGFloat windowWidth = self.mainView.frame.size.width; 
CGFloat windowHeight = self.mainView.frame.size.height; 
CGRect offScreenLeft = CGRectMake(-1*windowWidth, 0.0, windowWidth, windowHeight); 
CGRect onScreen = self.mainView.frame; 
CGRect offScreenRight = CGRectMake(windowWidth, 0.0, windowWidth, windowHeight); 


if (direction == TransitionDirectionForward) 
{ 
    if (dragBackgroundOnscreen){ 
     [self.mainView addSubview:self.backgroundView]; 
     [self.mainView sendSubviewToBack:self.backgroundView]; 
     self.backgroundView.frame = offScreenRight; 
    } 


    self.currentViewController.view.frame = offScreenRight; 

    [UIView animateWithDuration:0.65 
        animations:^{ 
         oldViewController.view.frame = offScreenLeft; 
         if (dragBackgroundOffscreen) 
          self.backgroundView.frame = offScreenLeft; 
         else if (dragBackgroundOnscreen) 
          self.backgroundView.frame = onScreen; 

         self.currentViewController.view.frame = onScreen; 
        } 
        completion:^(BOOL finished){ 
         [oldViewController.view removeFromSuperview]; 
         if (dragBackgroundOffscreen) 
          [self.backgroundView removeFromSuperview]; 
         [oldViewController willMoveToParentViewController:nil]; 
         [oldViewController removeFromParentViewController]; 
         [self.currentViewController didMoveToParentViewController:self]; 
        }]; 


} 
else if (direction == TransitionDirectionBackward) 
{ 
    if (dragBackgroundOnscreen){ 
     [self.mainView addSubview:self.backgroundView]; 
     [self.mainView sendSubviewToBack:self.backgroundView]; 
     self.backgroundView.frame = offScreenLeft; 
    } 
    self.currentViewController.view.frame = offScreenLeft; 
    [UIView animateWithDuration:0.65 
        animations:^{ 
         oldViewController.view.frame = offScreenRight; 

         if (dragBackgroundOffscreen) 
          self.backgroundView.frame = offScreenRight; 
         else if (dragBackgroundOnscreen) 
          self.backgroundView.frame = onScreen; 

         self.currentViewController.view.frame = onScreen; 
        } 
        completion:^(BOOL finished){ 
         [oldViewController.view removeFromSuperview]; 
         if (dragBackgroundOffscreen) 
          [self.backgroundView removeFromSuperview]; 
         [oldViewController willMoveToParentViewController:nil]; 
         [oldViewController removeFromParentViewController]; 
         [self.currentViewController didMoveToParentViewController:self]; 
        }]; 

} 

我也想背景(self.backgroundView)保持靜止,除非移動到該有自己的背景屏幕(即我不想背景如果新視圖背景是相同的背景則滑動)。

我正在使用TransitionDirectionBackward和TransitionDirectionForward來區分向左滑動和向右滑動。

一切都很好,除了過渡涉及GMGridView。當Gridviews框架被設置爲離屏框架時,將其當前選定頁面的框架真正設置爲該離屏框架的問題。 GridView的其他頁面不受此框架限制,所以即使在轉換之前它們也可以出現在屏幕上。我嘗試在GridView的viewcontroller的視圖上設置框架和界限屬性,但是我仍然可以在轉換動畫之前獲取屏幕上出現的gridview頁面。

任何人都可以看到解決方案嗎?我試圖找到一種方法來在轉換過程中剪切GridView的視圖,這樣頁面就不會出現,除了當前選擇的頁面,但沒有發現任何有用的東西。

UPDATE:我發現可能的修復方法是通過設置alpha = 0.0來顯示但不應該是的單元格(稍後在轉換動畫完成時設置爲alpha = 1.0)。但是,我需要知道哪些細胞可以做到這一點。我需要一種方法來訪問GMGridView當前所在的頁面,以便我可以將相鄰頁面的單元格設置爲0.0。

更新:找到一種方法讓它通過使用myGridView convertPoint:(一個cgpoint我發現通過試驗和錯誤是在頁面的第一個單元格。)fromView:myGridView.window。注意:我需要一個if/else如果檢查我是否在lanscape left或landscape right,因爲當設備旋轉時窗口座標不旋轉。與此我能夠得到單元格的索引在我指定的屏幕上的點,然後設置上一頁是透明的,直到過渡動畫。

我仍然想知道是否有「裁剪」gridview的方式,以便如果單元格可能是不透明的,但只是從不顯示....?

回答

2

我覺得我過於複雜的問題。我正在尋找UIView的clipsToBounds方法(儘管我可以發誓我之前嘗試過)。無論如何,現在它的工作!