2012-11-12 9 views
9

Sto imparando OpenGLES e sto provando a inserire un GLKViewer in un UIViewController.glkView drawInRect non chiamato

So che posso risolvere i problemi principali utilizzando GLViewController, ma sto cercando di imparare come farlo in questo modo.

Ho trovato questa domanda, Nesting GLKView into UIViewController e Nested GLKView and GLKViewController ma devo mancare qualcosa anche se penso che sto facendo tutti i passi giusti perché quando corro il mio progetto, non sto arrivando alla linea di stampa drawInRect.

Nello storyboard sto indicando ViewController come delegato del componente glkview.

ho cercato di mantenere il codice il più semplice possibile e qualsiasi aiuto sarà apprezzato:

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 

* Aggiornamento *

Per quanto posso dire al glkview sia collegato correttamente come suggerito per e ha aggiunto la josh-Knapp e chiamato setNeedsDisplay.

Nel caso in cui ci sia qualcosa che mi manca, ho caricato una copia del progetto qui: https://github.com/jcrogel/OpenGLDebug.git

Io sono un noob totale in questo modo mi scuso per qualsiasi supervisione stupido :)

+0

Ok ho notato che ho ottenuto un voto 'vicino' e 2 voti bassi senza ulteriore spiegazione di cosa c'è di sbagliato nella domanda o di come la mia domanda sarebbe stata migliore. Qualsiasi feedback per riconquistare i miei punti sarebbe apprezzato. –

+2

Penso che i downvoters dovrebbero spiegare la loro ragione invece di segnare ciecamente questo per chiudere. Ovviamente l'OP ha fatto uno sforzo qui per fornire sia una spiegazione che un codice. Un semplice commento che richiedeva informazioni mancanti avrebbe aiutato. – jdi

+1

Per quanto mi riguarda, non l'ho inizializzato con un contesto ed è per questo che non è stato chiamato. –

risposta

9

didn' Dite che avete collegato la proprietà glview di MyGLController nello storyboard, quindi verificatelo.

Successivamente, si imposta il contesto glview dopo che carica. Senza un GLKViewController, non c'è nulla che dica la glview che deve essere disegnata. Assicurati di chiamare [self.glview setNeedsDisplay] da qualche parte dopo aver impostato il contesto.

+0

Grazie ho dato una prova ma non ha funzionato, ho aggiornato la domanda con le informazioni extra e un link al repository github che ho aggiunto con il progetto stesso –

+0

Giusto per chiarire, la chiamata che dovevo fare era: self.glview.setNeedsDisplay = YES; –

+2

Questo dovrebbe essere: self.glview.enableSetNeedsDisplay = YES; – inwit

1

Vedo che questa domanda ha già avuto risposta. Ma ho avuto lo stesso problema, con una soluzione diversa. Ho pensato di postare le informazioni qui nel caso in cui altri potrebbero trarne beneficio.

Problema Descrizione

Durante l'utilizzo GLKView e GLKViewController, la funzione render loop (drawInRect) viene chiamato una volta, ma non chiamato di nuovo.

Possibile causa

alcuni metodi per CViewController sono state attuate in modo non corretto, senza chiamare i loro melari. Il seguente codice illustra tre di queste funzioni. Gli esempi seguenti hanno le tre funzioni implementate correttamente, chiamando i loro supers.

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

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

Ho avuto un problema simile.

Per impostazione predefinita, xcode imposta la casella di controllo enable setNeedsDisplay su NO nell'elenco di proprietà GLKView.
Una volta cambiato, ha funzionato.

+0

Grazie mille. Mi hai salvato. Ho avuto lo stesso problema. Il controllo della scatola ha risolto il problema. – techgentsia