我正在使用自定義控制器進行轉換(無法使用導航控制器,這是由於項目中的固有周期,導致導航控制器堆棧無限增長[我認爲會導致內存問題])。我正在使用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的方式,以便如果單元格可能是不透明的,但只是從不顯示....?