【问题标题】:glkView drawInRect not called未调用 glkView drawInRect
【发布时间】:2012-11-12 16:28:22
【问题描述】:

我正在学习 OpenGLES,我正在尝试将 GLKViewer 放在 UIViewController 中。

我知道我可以通过使用 GLViewController 来解决主要问题,但我正在尝试学习如何做到这一点。

我发现了这个问题,Nesting GLKView into UIViewControllerNested GLKView and GLKViewController,但即使我认为我正在执行所有正确的步骤,我也一定遗漏了一些东西,因为当我运行我的项目时,我没有到达 drawInRect 打印线。

在故事板中,我将 ViewController 指定为 glkview 组件的代表。

我尽量让代码保持简单,如有任何帮助,我们将不胜感激:

MyController.h

#import <Foundation/Foundation.h>
#import <GLKit/GLKit.h>

@interface MyGLController : UIViewController <GLKViewDelegate>
{
    GLuint vertexBufferID;

}

@property (weak, nonatomic) IBOutlet GLKView *glview;

@property (strong, nonatomic) GLKBaseEffect *baseEffect;

@end

MyGLController.m

#import "MyGLController.h"

@implementation MyGLController

//@synthesize baseEffect;

-(void) viewDidLoad{
    [super viewDidLoad];

    self.glview.context = [[EAGLContext alloc] initWithAPI:
     kEAGLRenderingAPIOpenGLES2];

     [EAGLContext setCurrentContext:self.glview.context];
    printf("View Loaded");
}


- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    printf("DrawInRect");
}

@end

* 更新 *

据我所知,glkview 已按照建议正确连接,并添加了 josh-knapp 并调用了 setNeedsDisplay。

如果我遗漏了什么,我已经在此处上传了该项目的副本:https://github.com/jcrogel/OpenGLDebug.git

我在这方面完全是菜鸟,所以我为任何愚蠢的疏忽道歉:)

【问题讨论】:

  • 好的,我注意到我得到了“接近”票和 2 票反对票,而没有进一步解释问题中的问题或我的问题会如何变得更好。任何能重新获得我的积分的反馈将不胜感激。
  • 我认为反对者应该解释他们的原因,而不是盲目地将其标记为关闭。 OP 显然在这里努力提供解释和代码。请求缺失信息的简单评论会有所帮助。
  • 对我来说,我没有使用上下文进行初始化,这就是它没有被调用的原因。

标签: iphone objective-c ios opengl-es opengl-es-2.0


【解决方案1】:

你没有说你在故事板中连接了 MyGLController 的 glview 属性,所以验证一下。

接下来,您将在 glview 上下文加载后设置它。如果没有 GLKViewController,则无法告诉 glview 需要绘制它。确保在设置上下文后在某处调用[self.glview setNeedsDisplay]

【讨论】:

  • 谢谢,我试了一下,但没有用,我已经用额外的信息和我在项目本身中添加的 github 存储库的链接更新了问题
  • 澄清一下,我需要做的调用是:self.glview.setNeedsDisplay = YES;
  • 应该是:self.glview.enableSetNeedsDisplay = YES;
  • 我必须两者都做:self.glview.enableSetNeedsDisplay = YES; [self.glview setNeedsDisplay];
【解决方案2】:

我也遇到过类似的问题。

默认情况下,xcode 在GLKView 属性列表中将enable setNeedsDisplay 复选框设置为NO
一旦我改变了它,它就起作用了。

【讨论】:

  • 非常感谢。你救了我。我遇到过同样的问题。选中该框可解决问题。
【解决方案3】:

我看到这个问题已经回答了。但我遇到了同样的问题,但有不同的解决方案。我想我会在这里发布信息,以免其他人可能从中受益。

问题描述

在使用 GLKView 和 GLKViewController 时,渲染循环函数 (drawInRect) 会被调用一次,但不会再次调用。

可能原因

CViewController 的一些方法被错误地实现,没有调用它们的超类。下面的代码说明了三个这样的函数。下面的例子正确实现了三个函数,调用了它们的 supers。

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:NO];
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:NO];
}
-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:NO];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 2023-03-12
    • 2018-08-07
    相关资源
    最近更新 更多