为啥在 ViewDidLoad 中没有设置 GLKView 的 DrawableWidth?

Posted

技术标签:

【中文标题】为啥在 ViewDidLoad 中没有设置 GLKView 的 DrawableWidth?【英文标题】:Why is GLKView's DrawableWidth not set in ViewDidLoad?为什么在 ViewDidLoad 中没有设置 GLKView 的 DrawableWidth? 【发布时间】:2012-03-04 18:33:55 【问题描述】:

我正在使用 GLKit 的 GLKViewController/GLKView 来做一些基本的 OpenGL 绘图。

我想在 ViewDidLoad 方法中设置 ViewPort。在阅读了 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 时,它们被设置并且它们的值是我所期望的。

【问题讨论】:

【参考方案1】:

GLKView Class Reference 是这样说的:

此后,每当必须重绘视图时,视图都会自动创建或更新帧缓冲区对象。

在您收到viewDidLoad 时还没有创建帧缓冲区,因为还不需要绘制视图。所以帧缓冲区的尺寸也不存在。

此时系统不适合创建帧缓冲区。该视图尚未添加到屏幕视图层次结构中。将其添加到屏幕视图层次结构后,可能会调整其大小,这需要丢弃旧的帧缓冲区并创建一个新的。

视图会一直等待,直到它实际被要求绘制自己以创建帧缓冲区,这样它就不会浪费时间创建帧缓冲区,只是为了稍后扔掉。

【讨论】:

感谢您的澄清,我想我应该使用view.frame.size 进行设置。 viewDidLoad 也不是使用view.frame.size 的好时机。 ***.com/a/9540935/77567 那么...什么时候是好时机,@rob?编辑:哦,使用UIScreen.mainScreen().bounds.widthheight 可能会更好。 viewDidLayoutSubviews. 为了记录,它们似乎也没有设置,所以我也在那里使用UIScreen.mainScreen().bounds。 (请原谅我在 ObjC 问题中的 Swift。)【参考方案2】:

您必须先致电[view bindDrawable];

那么drawableWidthheight 将是正确的。这是因为在设置帧缓冲区后未绑定,drawableWidth / height 反映了帧缓冲区属性。

【讨论】:

以上是关于为啥在 ViewDidLoad 中没有设置 GLKView 的 DrawableWidth?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 viewDidAppear 没有被触发?

为啥在 viewDidLoad 中添加子视图不起作用

为啥“numberOrRowsInSection”在“viewDidLoad”中途被调用?

为啥我可以在 viewDidAppear 中访问 Core Data 实体,但不能在 viewDidLoad 中访问?

为啥我没有收到任何加速度计更新?

为啥 viewDidLoad 中的 self.navigationController 为空?