我正在制作一个OpenGL ES应用程序,我正在尝试研究如何在视图上将UIKit
GUI的一部分合并到OpenGL ES上。
在EAGLView
类的init方法中,我设置了UITextField
:
add_name_field = [[UITextField alloc] initWithFrame: CGRectMake(10, 10, [UIScreen mainScreen].bounds.size.width, 50)];
drawRect方法中的某个地方,我为游戏渲染和处理了所有内容:
[add_name_field becomeFirstResponder];
[self insertSubview: add_name_field atIndex:0];
我可以确认调用此代码是因为我使用NSLog
来测试它,但是当它运行时,文本字段不显示在游戏的OpenGL视图中。如果我将代码放在init方法中,则文本字段会在游戏开始时用键盘正确显示。
那么如何让它在drawRect方法中运行?
谢谢你的回答。在此期间,我将为代表编写一些代码。
答案 0 :(得分:2)
感谢所有其他答案,但我找到了解决方案。
这是一个简单的解决方案。我只是将addSubView方法移动到EAGLView类的初始化。键盘不会显示,直到我将文本字段作为第一响应者。当我完成它之后,我可以简单地清除文本并使EAGLView类再次成为第一个响应者并再次隐藏它。
这样我就可以简单地使用键盘为我的游戏输入文字,在输入时显示文字并在之后隐藏它。
答案 1 :(得分:1)
我假设你在UIViewController子类中,上面的代码?如果是,那么而不是
[self insertSubview: add_name_field atIndex:0];
做的:
[self.view addSubview:add_name_field];
重要的是,您在self.view
而不是self
上调用此方法。添加子视图是VIEW功能,而不是View CONTROLLER功能。
insertSubview:atIndex:
也应该工作(如果在正确的对象上调用),但addSubview:
会将它贴在视图的顶部,无论其他什么,所以它有点清洁。
答案 2 :(得分:1)
在drawRect之外添加文本子视图。 drawRect用于渲染一个视图,可能会或可能不会忽略绘制任何其他视图(例如文本视图),具体取决于视图堆栈的呈现方式。
答案 3 :(得分:0)
有没有理由在drawRect方法中完成它?你说它在init方法中工作正常,那么为什么不在那里呢?
至于为什么它不起作用,我并不完全了解OpenGL视图,但是,假设它们像普通的UIViews一样工作,你可能不应该在drawRect函数中添加其他UIViews。 UIViews没有得到展示&立即绘制;他们必须等到跑道告诉他们画画。可能会发生的事情是,当你的superview的drawRect完成时,它假定它的所有子视图都已完成绘图,并没有意识到你新添加的文本字段没有机会。您可以尝试在文本字段上调用setNeedsDisplay。