操作主要在positionInput中进行 注意根据不同版本来自行定义;
#include "Keyboard.h"
#include "DisplayManager.h"
#include "UnityForwardDecls.h"
#include <string>
#ifndef FILTER_EMOJIS_IOS_KEYBOARD
#define FILTER_EMOJIS_IOS_KEYBOARD 1
#endif
static KeyboardDelegate* _keyboard = nil;
static bool _shouldHideInput = false;
static bool _shouldHideInputChanged = false;
static const unsigned kToolBarHeight = 40;
@implementation KeyboardDelegate
{
UIView *_rootView;
// UI handling
// in case of single line we use UITextField inside UIToolbar
// in case of multi-line input we use UITextView with UIToolbar as accessory view
// toolbar buttons are kept around to prevent releasing them
// tvOS does not support multiline input thus only UITextField option is implemented
#if UNITY_IOS
UITextView* textView;
UIToolbar* viewToolbar;
NSArray* viewToolbarItems;
#endif
UITextField* textField;
// keep toolbar items for both single- and multi- line edit in NSArray to make sure they are kept around
#if UNITY_IOS
UIToolbar* fieldToolbar;
NSArray* fieldToolbarItems;
#endif
// inputView is view used for actual input (it will be responder): UITextField [single-line] or UITextView [multi-line]
// editView is the "root" view for keyboard: UIToolbar [single-line] or UITextView [multi-line]
UIView* inputView;
UIView* editView;
CGRect _area;
NSString* initialText;
UIKeyboardType keyboardType;
BOOL _multiline;
BOOL _inputHidden;
BOOL _active;
BOOL _done;
BOOL _canceled;
// not pretty but seems like easiest way to keep "we are rotating" status
BOOL _rotating;
}
@synthesize area;
@synthesize active = _active;
@synthesize done = _done;
@synthesize canceled = _canceled;
@synthesize text;
@synthesize selection;
-(void) getRootView:(UIView *_Nonnull)rootView{
_rootView = rootView;
}
- (BOOL)textFieldShouldReturn:(UITextField*)textFieldObj
{
[self hide];
return YES;
}
- (void)textInputDone:(id)sender
{
[self hide];
}
- (void)textInputCancel:(id)sender
{
_canceled = true;
[self hide];
}
- (BOOL)textViewShouldBeginEditing:(UITextView*)view
{
#if !UNITY_TVOS
view.inputAccessoryView = viewToolbar;
#endif
return YES;
}
#if UNITY_IOS
- (void)keyboardDidShow:(NSNotification*)notification
{
if (notification.userInfo == nil || inputView == nil)
return;
CGRect srcRect = [[notification.userInfo objectForKey: UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect rect = [UnityGetGLView() convertRect: srcRect fromView: nil];
[self positionInput: rect x: rect.origin.x y: rect.origin.y];
_active = YES;
}
- (void)keyboardWillHide:(NSNotification*)notification
{
[self systemHideKeyboard];
}
- (void)keyboardDidChangeFrame:(NSNotification*)notification
{
_active = true;
CGRect srcRect = [[notification.userInfo objectForKey: UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect rect = [UnityGetGLView() convertRect: srcRect fromView: nil];
if (rect.origin.y >= [UnityGetGLView() bounds].size.height)
[self systemHideKeyboard];
else
[self positionInput: rect x: rect.origin.x y: rect.origin.y];
}
#endif
+ (void)Initialize
{
NSAssert(_keyboard == nil, @"[KeyboardDelegate Initialize] called after creating keyboard");
if (!_keyboard)
_keyboard = [[KeyboardDelegate alloc] init];
}
+ (KeyboardDelegate*)Instance
{
if (!_keyboard)
_keyboard = [[KeyboardDelegate alloc] init];
return _keyboard;
}
#if UNITY_IOS
struct CreateToolbarResult
{
UIToolbar* toolbar;
NSArray* items;
};
- (CreateToolbarResult)createToolbarWithView:(UIView*)view
{
UIToolbar* toolbar = [[UIToolbar alloc] initWithFrame: CGRectMake(0, 160, 320, kToolBarHeight)];
UnitySetViewTouchProcessing(toolbar, touchesIgnored);
toolbar.hidden = NO;
UIBarButtonItem* inputItem = view ? [[UIBarButtonItem alloc] initWithCustomView: view] : nil;
UIBarButtonItem* doneItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemDone target: self action: @selector(textInputDone:)];
UIBarButtonItem* cancelItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemCancel target: self action: @selector(textInputCancel:)];
NSArray* items = view ? @[inputItem, doneItem, cancelItem] : @[doneItem, cancelItem];
toolbar.items = items;
inputItem = nil;
doneItem = nil;
cancelItem = nil;
//[view bringSubviewToFront:editView];
//view.alpha = 0;
CreateToolbarResult ret = {toolbar, items};
return ret;
}
#endif
- (id)init
{
NSAssert(_keybo