Определенно, вы, кажется, вызываете setContext в стандартном UIView, а не в EAGLView.Ваш контроллер представления, вероятно, должен реализовать -loadView и сделать что-то вроде этого:
- (void)loadView {
self.view = [[EAGLView alloc] initWithFrame:[UIScreen mainScreen].bounds];
}
Одна вещь, которая кажется странной, это то, что вы инициализируете свой контроллер представления с помощью initWithNibName, а не initWithFrame, чего я и ожидалВы должны сделать это, когда покончите с файлами nib / xib.
Вот что я делаю, возможно, это поможет.
(Обратите внимание: у меня есть пользовательский контроллер представления, который имеет UIView и подпредставление, которое является EAGLView. (Я также работаю над добавлением подпредставления ADBanner). Я не вызываю 'init'на моем контроллере загружается представление , когда я пытаюсь добавить его в окно в качестве подпредставления.)
main.m - аналогично.
AppDelegate.m:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Create the window programatically:
window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
controller = [GLViewController alloc];
[window addSubview:controller.view];
glView = [controller.glView retain];
[window makeKeyAndVisible];
return YES;
}
ViewController.h:
@interface GLViewController : UIViewController <ADBannerViewDelegate>
{
EAGLView *glView;
}
@property(nonatomic, retain) /*IBOutlet*/ EAGLView *glView;
@end
ViewController.m:
- (void)loadView
{
self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
}
-(void)viewDidLoad
{
[super viewDidLoad];
glView = [[EAGLView alloc] initWithFrame:[UIScreen mainScreen].bounds];
glView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin;
glView.userInteractionEnabled=YES;
[self.view addSubview:glView];
}
EAGLView.m:
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame])
{
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;// JPS - WARNING: this does not work on iOS 3.2!!!
self.contentScaleFactor = [UIScreen mainScreen].scale;
CGSize displaySize = [[UIScreen mainScreen]currentMode].size;
CGRect displayRect = [UIScreen mainScreen].bounds;
eaglLayer.frame = displayRect;
eaglLayer.opaque = YES;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys : [NSNumber numberWithBool : NO],
kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8,
kEAGLDrawablePropertyColorFormat, nil];
context = [[EAGLContext alloc] initWithAPI : kEAGLRenderingAPIOpenGLES1];
if (!context || ![EAGLContext setCurrentContext : context]) {
[self release];
return;
}
glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer *)self.layer];
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
// Set up thd display link to sync rendering with vblank
animating = FALSE;
displayLinkSupported = FALSE;
animationFrameInterval = 1;
displayLink = nil;
animationTimer = nil;
// A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer
// class is used as fallback when it isn't available.
NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
displayLinkSupported = TRUE;
}
return self;
}