glkView drawInRect не е извикан

Уча OpenGLES и се опитвам да поставя GLKViewer в UIViewController.

Знам, че мога да преодолея основните проблеми с помощта на GLViewController, но се опитвам да се науча как да го направя по този начин.

Намерих този въпрос, Вмъкване на GLKView в UIViewController и Вложени GLKView и 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

Аз съм пълен нуб в това, така че се извинявам за всяка глупава грешка :)


person Juan Carlos Moreno    schedule 12.11.2012    source източник
comment
Добре, забелязах, че получих глас „близо“ и 2 гласа против без допълнително обяснение какво не е наред във въпроса или как въпросът ми би бил по-добър. Всяка обратна връзка за възстановяване на точките ми ще бъде оценена.   -  person Juan Carlos Moreno    schedule 12.11.2012
comment
Мисля, че противниците трябва да обяснят причината си, вместо сляпо да маркират това за затваряне. Оперативната програма очевидно се е постарала тук да предостави както обяснение, така и код. Един прост коментар, изискващ липсваща информация, би помогнал.   -  person jdi    schedule 12.11.2012
comment
При мен не инициализирах с контекст и затова не беше извикан.   -  person Sam Soffes    schedule 19.02.2014


Отговори (3)


Не казахте, че сте свързали свойството glview на MyGLController в сценария, така че проверете това.

След това настройвате контекста на glview, след като се зареди. Без GLKViewController нищо не подсказва на glview, че трябва да бъде начертан. Уверете се, че сте извикали [self.glview setNeedsDisplay] някъде, след като контекстът е настроен.

person Josh Knapp    schedule 12.11.2012
comment
Благодаря, опитах го, но не се получи, актуализирах въпроса с допълнителна информация и връзка към github repo, което добавих със самия проект - person Juan Carlos Moreno; 13.11.2012
comment
Само за да поясня, извикването, което трябваше да направя, беше: self.glview.setNeedsDisplay = YES; - person Juan Carlos Moreno; 13.11.2012
comment
Това трябва да бъде: self.glview.enableSetNeedsDisplay = YES; - person inwit; 08.04.2014
comment
Трябваше да направя и двете: self.glview.enableSetNeedsDisplay = YES; [self.glview setNeedsDisplay]; - person Yahel; 10.04.2017

Имах подобен проблем.

По подразбиране xcode поставя квадратчето за отметка enable setNeedsDisplay на NO в списъка със свойства GLKView.
След като го промених, проработи.

person ashabtay    schedule 09.01.2014
comment
Много благодаря. Ти ме спаси. Имах същия проблем. Поставянето на отметка в квадратчето отстрани проблема. - person techgentsia; 30.11.2017

Виждам, че на този въпрос вече е отговорено. Но имах същия проблем, с различно решение. Реших, че ще публикувам информацията тук, ако случайно други могат да се възползват от нея.

Описание на проблема

Докато използвате GLKView и GLKViewController, функцията за цикъл на изобразяване (drawInRect) се извиква веднъж, но не се извиква отново.

Възможна причина

Някои методи към CViewController са имплементирани неправилно, без да се извикват техните supers. Следният код илюстрира три такива функции. В примерите по-долу трите функции са имплементирани правилно, като се наричат ​​техните supers.

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

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