我正在使用自定义控制器进行转换(由于项目中的固有循环,无法使用导航控制器,这将允许导航控制器堆栈无限增长[我认为这会导致内存问题])。我正在使用 UIView animateWithDuration:animations:completion 模拟导航控制器的滑动动画(过渡到新屏幕时):
当按下触发转换的按钮时,我要转换到的新视图的框架设置为屏幕外位置。在过渡动画(UIView animateWithDuration:animations:completion:) 中,当前屏幕上的视图将其框架设置为屏幕外位置,而新视图设置为屏幕上位置。
这是在我的自定义控制器中进行转换:
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 视图上设置 frame 和 bounds 属性,但我仍然可以在过渡动画之前获得出现在屏幕上的 gridview 页面。
有人看到解决方案吗?我试图找到一种方法来在过渡期间剪辑 GridView 的视图,这样除了当前选择的页面之外,页面不会出现,但没有发现任何有用的东西。
更新:我通过为可见但不应该的单元格设置 alpha = 0.0 找到了一个可能的修复方法(稍后在过渡动画完成时设置 alpha = 1.0)。但是,我需要知道要为哪些单元格执行此操作。我需要一种方法来访问 GMGridView 当前所在的页面,以便我可以将相邻页面的单元格设置为具有 0.0 的 alpha。
更新:找到了一种通过使用 myGridView convertPoint 使其工作的方法:(我通过反复试验发现位于页面的第一个单元格上的 cgpoint。)fromView:myGridView.window。注意:我需要一个 if/else if 来检查我是在横向左侧还是横向右侧,因为当设备旋转时窗口坐标不会旋转。有了这个,我能够在我指定的屏幕上的点处获取单元格的索引,然后将上一页设置为透明,直到过渡动画之后。
我仍然想知道是否有一种“剪裁”网格视图的方法,以便单元格可以是不透明的,但从不显示......?