ios - 如何在 OpenGL es 应用程序中使用键盘

标签 ios objective-c opengl-es keyboard glkview

我有一个使用键盘的 OpenGL ES 应用程序。触摸屏幕时,我可以在屏幕上弹出键盘。如果我是正确的,每次我按下一个键,

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 

应该被调用。但事实并非如此。该应用程序最初是一个纯 OpenGL Mac 游戏,我正在尝试制作一个 iOS 版本,所以我没有使用 Storyboard。如果可能的话,我更喜欢以编程方式完成所有事情。这是我的 ViewController.h 代码:

#import <GLKit/GLKit.h>
#import "KeyboardView.h"

@interface ViewController : GLKViewController {
    KeyboardView* keyBoard;
}
@end

ViewController.m的相关部分:

- (void)viewDidLoad
{
[super viewDidLoad];
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
if (!self.context) {
    NSLog(@"Failed to create ES context");
}
GLKView *view = (GLKView *)self.view;
view.context = self.context;
view.drawableDepthFormat = GLKViewDrawableDepthFormat24;

CGRect viewRect = CGRectMake(0, 0, 100, 100);
keyBoard = [[KeyboardView alloc] initWithFrame:viewRect];

[self setupGL];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    [self.view addSubview:keyBoard];
    [keyBoard becomeFirstResponder];
}

键盘 View .h:

#import <UIKit/UIKit.h>

@interface KeyboardView : UIView <UIKeyInput, UITextFieldDelegate> {
    UITextField *field;
}

键盘 View .m:

#import "KeyboardView.h"
@implementation KeyboardView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
    field = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 100, 10)];
    }
    return self;
}

- (void)insertText:(NSString *)text {

}

- (void)deleteBackward {

}

- (BOOL)hasText {
    return YES;
}

- (BOOL)canBecomeFirstResponder {
    return YES;
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

NSLog(@"text: %@", textField.text);
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
if ([newString length] < 1) {
    return YES;
} else
    {
    textField.text = [newString length] > 1 ? [newString substringToIndex:1] : newString;
    [textField resignFirstResponder];
    return NO;
    }
}

@end

我需要能够在键盘处于事件状态时获取用户输入的每个字符。我最承认,我有点困惑。我不确定我的方法是否正确,所以非常感谢您的帮助。

最佳答案

键盘文本输入不是通过 UITextField 捕获的

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

确实是通过UIKeyInput

获取的

- (void)insertText:(NSString *)text;

我正在使用软键盘在我的 GLKView (OpenGLES) 应用程序上捕获文本,我什至根本不需要任何 UITextField

供引用:

UIKeyInput Reference Doc

编辑:

您需要调用键盘 View 的becomeFirstResponder 来显示您的键盘并调用resignFirstResponder 来隐藏它

您还需要覆盖 canBecomeFirstResponder 并返回 TRUE

关于ios - 如何在 OpenGL es 应用程序中使用键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25593606/

相关文章:

iphone - 如何以编程方式调用电话?

c++ - cocos2d 中的 setScale 特定时间 Xcode

ios - 创建登录页面并存储 token 字符串

ios - LocatinManager 的 iOS CLRegion 功能的最小半径

android - OpenGL ES 纹理内存

ios - 当我将图像上传到 Firebase Storage 时,会出现额外的图像。 swift 4、Xcode 9

ios - iOS 10 的 Cell 耗尽了 tableview

iOS 8 : Background execution

android - glMapBufferRange() 使用 TrasnformFeedback 在 Android OpenGLES 3.0 中返回全零

java - Android OpenGL ES - 我无法使 gluLookAt/gluPerspective 工作