2012-03-04 51 views
3

我正在使用GLKit的GLKViewController/GLKView來做一些基本的OpenGL繪圖。爲什麼在ViewDidLoad中沒有設置GLKView的DrawableWidth?

我想設置了視區viewDidLoad方法。閱讀GLKView引用之後,我想我能做到這一點是這樣的:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 
    if (!self.context) { 
     NSLog(@"Failed to create ES context"); 
    } 
    GLKView *view = (GLKView *)self.view; 
    view.context = self.context; 
    glViewport(0, 0, view.DrawableWidth, view.DrawableHeight); 
} 

的問題是,無論DrawableWidthDrawableHeight屬性是零。這是爲什麼?當GLKView調用DrawInRect時,它們被設置並且它們的值是我所期望的。

回答

3

GLKView Class Reference這樣說:

在此之後,視圖會自動創建或更新每當視圖必須重繪幀緩衝區對象。

當您收到viewDidLoad時,framebuffer尚未創建,因爲視圖不需要繪製。所以幀緩衝區的尺寸也不存在。

這將是不恰當的系統創建的這個時候幀緩衝。該視圖尚未添加到屏幕視圖層次結構中。將其添加到屏幕視圖層次結構後,其大小可能會調整,這需要丟棄舊的幀緩衝區並創建一個新的幀緩衝區。

的觀點等待,直到它實際上是要求畫自己創建的幀緩衝,因此不會浪費時間來創建一個幀緩衝只是後來扔掉。

+0

感謝您的澄清,我想我應該只使用'view.frame.size'來進行設置。 – 2012-03-04 19:40:41

+0

'viewDidLoad'也不是使用'view.frame.size'的好時機。 http://stackoverflow.com/a/9540935/77567 – 2012-03-04 19:44:57

+0

有用的文章,謝謝! – 2012-03-04 22:55:21

1

您必須先打電話[view bindDrawable];

然後drawableWidthheight將是正確的。這是因爲在設置幀緩衝器未綁定並且反映幀緩衝器屬性之後。

相關問題