2011-02-25 115 views
2

我正在做一個應用程序,我有一個GLES視圖,我不想被自動旋轉,並且UIKit視圖在上面,其中需要自動旋轉。旋轉一些UIViews,但不是全部?

顯然這不是你應該做的事情,因爲我找不到任何好的文檔。不過,我完全確定這正是我想要的。

我已經找到了解決辦法,但感覺哈克:

  1. 創建窗口。
  2. 創建一些自動旋轉的UIViewControllers。
  3. 將他們的意見添加到窗口。
  4. 創建一個OpenGL ES視圖控制器而不是自動旋轉。
  5. 將其視圖添加到窗口中。
  6. 調用bringSubviewToFront:用於自動旋轉的視圖。
  7. 給自己一個高五,而試圖忽略這種嘮叨的感覺,這實際上是一個討厭的黑客。

任何人都知道更好的解決方案?注意:我非常肯定我想自動旋轉UIKit視圖而不是GL視圖。

感謝您的時間,非常感謝。 =)

回答

1

沒有一個好的方法可以做得比您提出的要好。

你確定你不只是想旋轉OpenGL視圖嗎?如果您的應用程序僅限於ES 2.0設備以及更高版本的iOS 4.2,那麼在OpenGL視圖中使用UIViewController旋轉不會​​有任何性能損失。

0

旋轉時畫出OpenGL內容會不會更簡單?只需在渲染器中應用旋轉即可撤消OpenGL視圖的旋轉。

您可能會看到不可接受的跳回到原來的旋轉,但您可以很容易地解決。視圖旋轉完成後,您可以爲返回旋轉設置動畫。或者,您可以覆蓋willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:以在界面旋轉過程中保持原有內容的動畫效果。

0

因此,我發現它是如何在幕後工作的; Frogblast是對的,沒有任何實質上更好的方法來做到這一點。

發生什麼事是,當一個視圖被添加到沒有子視圖的窗口時,該視圖的控制器自動成爲「旋轉權限」;如果該視圖控制器從shouldAutorotateToInterfaceOrientation返回NO,則其他視圖也不會旋轉。然而,即使「旋轉權限」確實旋轉,仍然允許後續視圖(與控制器)添加到窗口而不是旋轉。

不清楚爲什麼他們這樣做,但你有它。

2

對於類似的情況,我提出了不同的策略。在我的情況下,我允許所有的視圖旋轉,但然後使用變換,使我想保持穩定回到原來的方向。這是有效的,因爲「非旋轉」視圖是方形的,但是有更多的數學運算也可以用於其他形狀。下面是我把我的willRotateToInterfaceOrientation:duration:

switch (toInterfaceOrientation) { 
    case UIInterfaceOrientationPortrait: 
     steadyView.transform = CGAffineTransformIdentity; 
     break; 
    case UIInterfaceOrientationLandscapeLeft: 
     steadyView.transform = CGAffineTransformMakeRotation(M_PI_2); 
     break; 
    case UIInterfaceOrientationPortraitUpsideDown: 
     steadyView.transform = CGAffineTransformMakeRotation(M_PI); 
     break; 
    case UIInterfaceOrientationLandscapeRight: 
     steadyView.transform = CGAffineTransformMakeRotation(3*M_PI_2); 
     break; 
} 

控制器的steadyView爲s子視圖。這似乎有伎倆。

相關問題