GMGridView出现在屏幕外,但与屏幕视图重叠

问题描述:

我正在使用自定义控制器进行转换(无法使用导航控制器,这是由于项目中的固有周期,导致导航控制器堆栈无限增长[我认为会导致内存问题])。我正在使用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的方式,以便如果单元格可能是不透明的,但只是从不显示....?

我觉得我过于复杂的问题。我正在寻找UIView的clipsToBounds方法(尽管我可以发誓我之前尝试过)。无论如何,现在它的工作!