2014-04-15 138 views
2

我有一個佈局,其中屏幕分爲兩部分:頂部爲UIView,底部爲GLKViewController。問題是,當屏幕方向改變時,零件被旋轉並逐漸拉伸直到動畫結束,此時將繪製新的未拉伸的框架。GLKViewController方向動畫

是否有一種方法可以禁用GLKViewController的自動旋轉動畫,所以我可以通過操作modelview-projection矩陣手動設置動畫效果?

+0

你能提供一些代碼 – iOSdev

+0

其實我想知道你們是怎麼出示您的視圖控制器 – iOSdev

+0

我只是子類正常GLKViewController並將其添加到故事板。我在glkView:drawInRect:方法中繪製了一個正方形,但是當手機旋轉時,正方形被拉伸爲一個矩形,直到我回想到viewWillLayoutSubviews:中的glViewPort()方法。 – gq3

回答

1

如果您只是想要處理拉伸效果,則無需更換整個定向/旋轉系統。取決於您在應用程序的用戶界面中使用設備方向的次數,通過重新定位方向和旋轉,您可能會導致更多的維護難題。 (如果您需要做的不僅僅是解決拉伸效應,其他答案還是不錯的。)

您的視圖在旋轉動畫過程中自己繪製,因此您所要做的只是確保它自己繪製一種在動畫期間匹配其中間尺寸的方式。旋轉動畫由核心動畫處理,因此您在動畫期間使用其presentationLayer方法來訪問暫時狀態。例如:

CALayer *presentationLayer = [self.view.layer presentationLayer]; 
CGSize layerSize = presentationLayer.bounds.size; 
float aspect = fabsf(layerSize.width/layerSize.height); 
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(
    GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f); 

運行這個片段作爲更新的一部分/畫環路 - 注意,這可能意味着你的移動投影矩陣計算到更新/繪製循環,如果它不存在了。 (您可能還希望確保此代碼段僅在每個框架上運行,如果方向更改正在進行)。

要查看正在進行的動畫並確保它正常工作,請使用「切換慢動畫」命令iOS模擬器。

(信貸,因爲:代碼爲this answer

+0

謝謝,表示層邊界的大小正是我所需要的。 – gq3

0

GLKViewControllerUIViewController的子類。 UIViewController有一個方法willAnimateRotationToInterfaceOrientation:duration:您可以覆蓋它並配置視圖的動畫。

您可以在Responding to View Rotation Events部分的文檔中找到更多詳細信息:UIViewController Class Reference

+0

是的,我可以在willAnimateRotationToInterfaceOrientation:duration:中開始自定義動畫,但首先我需要禁用默認的GKLViewController framebuffer旋轉動畫。我怎麼做? – gq3

0

根據你想達到什麼,你會做不同的事情來禁用自動旋轉。

如果您根本不需要旋轉,請在項目級別禁用它。在Xcode中,使用導航器選擇項目(文件列表的頂部項目)並訪問目標應用程序的「常規」部分。對於設備的方向,勾去掉一切,但「肖像」:

Device Orientation List

如果你需要禁用它的一些「屏幕」,而不是爲別人,你需要在UIViewController水平不能旋轉。 UIViewController最初設計爲佔用整個屏幕區域,所以如果您使用管理GLKViewGLKViewController僅覆蓋部分屏幕,則很可能在另一個視圖控制器內。您需要繼承父視圖控制器並添加這些方法:

// From iOS 6 
- (BOOL)shouldAutorotate 
{ 
    return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

// iOS 5 
- (BOOL)shouldRotateToOrientation:(UIInterfaceOrientation)orientation 
{ 
    return NO; 
} 

這些將阻止父視圖控制器被旋轉。

最後,如果你需要允許在屏幕上的一些元素的旋轉,但不是別人,那麼你將有權決定使用哪種方法:

  • 讓屏幕旋轉,而旋轉回這些元素你想保持靜態。我不會推薦它。
  • 如上所述阻止屏幕旋轉,並通過設置transform屬性手動旋轉要旋轉的元素。這是我會去的。