2014-02-12 78 views
1

我正在使用OpenGL ES(2.0)專門爲我的應用程序。我試圖讓UIMotionEffect與我的一個OpenGL對象一起工作 - 我需要的就是「傾斜」值。使用UIMotionEffect與OpenGL ES

UIInterpolatingMotionEffect只能應用於UIView,和一個黑客將適用UIInterpolatingMotionEffectUIView,並從每幀有搶值,而不是渲染所謂UIView。但似乎太過黑客 - 是唯一的解決方案。

我試圖將子類UIMotionEffect,但無法弄清楚如何- (NSDictionary *)keyPathsAndRelativeValuesForViewerOffset:(UIOffset)viewerOffset工作(即什麼調用它,以及如何檢索我需要的值)。

關於如何在OpenGL上使用UIMotionEffect的任何想法?

回答

5

我最終測試了@rickster建議的方法:將UIInterpolatingMotionEffect連接到我的GLKView/GL View傳遞鍵定製,並檢索它們。不幸的是,這個想法完全失敗了。

首先,傳遞給UIInterpolatingMotionEffect的鍵必須是UIView的動畫屬性,並且不能是自定義變量/屬性。考慮到大多數人不希望他們的整個背景以單向方向/強度的視差,這種方法將失敗。

其次,你不能只檢索值。如果您通過center.x作爲關鍵字,UIInterpolatingMotionEffect將不會更新center.x,因爲這些更改被視爲「動畫」。因此,你有你檢索動畫center.x,例如[[view.layer presentationLayer] center];

最後說明:只要在主線程中創建一個單獨的UIView,把它添加到您的UIViewController,系統從中檢索值(也主線程)。我發現這是迄今爲止最簡單的解決方案。因爲我需要在一個單獨的線程上檢索這些值,所以我通常會將1值放在後面,因爲我派發到主線程來檢索當前值,同時檢索最後一個值集(確保變量是線程安全的/原子的)。

編輯

由於其最佳進入主線程的表示層,但我的方法被稱爲一個線程,是不是主要的,我派遣主線程檢索值,並將其放置在原子屬性。然後我會返回線程外的atomic屬性。這可以確保我的輔助線程不會被主線程阻塞,並且可以檢索我需要的值。

這裏是我以前從一個線程是不是主線程中檢索值的代碼:

@property (atomic) GLKVector2 currentOffset; 
@property (atomic, readonly) GLKVector2 offset; 

- (GLKVector2)offset 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     CGRect frame = [[self.view.layer presentationLayer] frame]; 
     self.currentOffset = (GLKVector2){-frame.origin.x, -frame.origin.y}; 
    }); 

    return self.currentOffset; 
} 
+0

你能提供在第4段,在這裏回答你的問題更詳細? –

+0

@JohnStephen做:) –

+0

謝謝,這是非常有益的! –

1

UIInterpolatingMotionEffect通過使用鍵值編碼爲UIView上的任何數值屬性設置值。這可以是您定義的任何屬性,而不僅僅是內置到UIView類中的那些屬性。

您需要某種UIView才能在屏幕上顯示您的內容。如果你在iOS上使用OpenGL ES,你最好使用GLKView,這是一個UIView子類,它管理着自己的GL幀緩衝區,併爲你提供了一個編寫GL繪圖代碼以渲染到這些幀緩衝區的地方。 (如果你不使用GLKView,你可能會使用某種自定義的UIView子類,它使用一個CAEAGLLayer呈現其內容。)

無論哪種方式,如果你已經有了GL-呈現的內容在屏幕上已經,你已經有一個UIView。如果該視圖不是您自己的自定義子類(無論是直接UIView子類還是GLKView子類),則可以將其設爲一個,並在其上定義自己的自定義屬性。然後設置您的UIInterpolatingMotionEffect以使用這些屬性。在您的視圖子類中,或任何負責GL渲染的對象中,讀取這些屬性的值並使用它們設置場景。 (例如,您可以使用它們來設置ModelView矩陣,並將其傳遞給着色器制服。)