How to use keyboard in OpenGL es app

881 Views Asked by At

I have an OpenGL ES app which uses keyboard. I can make the keyboard pop-up on screen when screen is touched. If I am correct, each time I press a key,

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

should be called. But it doesn't. The app was initially a pure OpenGL Mac game, which I am trying to make an iOS version of, so I am not using storyboard. I prefer to do everything programmatically if possible. Here is my code for ViewController.h:

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

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

relevant parts of 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];
}

KeyboardView.h:

#import <UIKit/UIKit.h>

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

KeyboardView.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

I need to be able to get each character entered by user while keyboard is active. I most confess, I am a little bit confused. I am not sure if my approach is correct, so I really appreciate your help.

1

There are 1 best solutions below

0
On

The keyboard text input isn't captured through the UITextField's

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

It is indeed captured through UIKeyInput's

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

I am using the soft keyboard to capture text on my GLKView (OpenGLES) app, and I don't even need any UITextField at all

For reference:

UIKeyInput Reference Doc

EDIT:

You need to call your keyboardview's becomeFirstResponder to show your keyboard and call resignFirstResponder to hide it

You also need to override canBecomeFirstResponder and return TRUE