これは、Appleが許可する限り完全にこれらに対処すると信じている私のカスタムキーボードです。
// PVKeyboard.h
#import <UIKit/UIKit.h>
@interface PVKeyboard : UIView
@property (nonatomic,assign) UITextField *textField;
@end
// PVKeyboard.m
#import "PVKeyboard.h"
@interface PVKeyboard () {
UITextField *_textField;
}
@property (nonatomic,assign) id<UITextInput> delegate;
@end
@implementation PVKeyboard
- (id<UITextInput>) delegate {
return _textField;
}
- (UITextField *)textField {
return _textField;
}
- (void)setTextField:(UITextField *)tf {
_textField = tf;
_textField.inputView = self;
}
- (IBAction)dataPress:(UIButton *)btn {
[self.delegate insertText:btn.titleLabel.text];
}
- (IBAction)backPress {
if ([self.delegate conformsToProtocol:@protocol(UITextInput)]) {
[self.delegate deleteBackward];
} else {
int nLen = [_textField.text length];
if (nLen)
_textField.text = [_textField.text substringToIndex:nLen-1];
}
}
- (IBAction)enterPress {
[_textField.delegate textFieldShouldReturn:_textField];
}
- (UIView *)loadWithNIB {
NSArray *aNib = [[NSBundle mainBundle]loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];
UIView *view = [aNib objectAtIndex:0];
[self addSubview:view];
return view;
}
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self)
[self loadWithNIB];
return self;
}
@end
XCode 4.3 以降では、UIView とユーザー インターフェイス ビュー ファイル (.xib ファイル用) に基づいて、objective-Class (.h & .m ファイル用) を作成する必要があります。3 つのファイルがすべて同じ名前であることを確認します。Identity Inspector を使用して、XIB の File's Owner Custom Class が新しいオブジェクトの名前と一致するように設定してください。属性インスペクタを使用して、フォームのサイズをフリーフォームに設定し、ステータス バーをなしに設定します。Size Inspector を使用して、フォームのサイズを標準キーボードの幅 (iPhone の縦向きの場合は 320、横向きの場合は 480) に一致するように設定しますが、任意の高さを選択できます。
フォームはすぐに使用できます。ボタンを追加し、必要に応じて dataPress、backPress、enterPress に接続します。initWithFrame: および loadWithNIB 関数は、Interface Builder で設計されたキーボードを使用できるようにするすべての魔法を実行します。
このキーボードを UITextField myTextField で使用するには、次のコードを viewDidLoad に追加するだけです。
self.keyboard = [[PVKeyboard alloc]initWithFrame:CGRectMake(0,488,320,60)];
self.keyboard.textField = self.myTextField;
いくつかの制限により、このキーボードは再利用できないため、フィールドごとに 1 つ必要になります。ほぼ再利用可能にできますが、それほど賢くはありません。キーボードも UITextFields に制限されていますが、これは主に、以下で説明するエンター キー機能の実装の制限によるものです。
このスターター フレームワークよりも優れたキーボードを設計できる魔法を次に示します...
このキーボードの唯一のプロパティである textField を、個別のセッター (setTextField) を使用して実装しました。
- 入力の問題を処理するには UITextField オブジェクトが必要です
- UITextField が必要なのは、UIKeyInput に準拠する UITextInput プロトコルに準拠しているためです。
- このキーボードを使用するように UITextInput の inputView フィールドを設定するのに便利な場所でした。
デリゲートという名前の 2 番目のプライベート プロパティに気付くでしょう。これは、本質的に UITextField ポインターを UITextInput ポインターに型キャストします。このキャストをインラインで行うこともできたかもしれませんが、おそらく UITextView のサポートを含めるために、これが将来の拡張機能として役立つ可能性があると感じました。
関数 dataPress は、UIKeyInput の insertText メソッドを使用して編集フィールドにテキスト入力を挿入するものです。これは、iOS 4 までさかのぼるすべてのバージョンで機能するようです。私のキーボードでは、各ボタンのラベルを単純に使用していますが、これはごく普通のことです。好きな NSString を使用してください。
関数 dataBack はバックスペースを行い、もう少し複雑です。UIKeyInput の deleteBackward が機能すると、見事に機能します。また、ドキュメントには iOS 3.2 まで動作すると書かれていますが、UITextField (および UITextView) が UITextInput プロトコルに準拠していた iOS 5.0 までしか動作しないようです。その前に、あなたは一人でいます。iOS 4 のサポートは多くの人にとって懸念事項であるため、UITextField で直接動作する不十分なバックスペースを実装しました。この要件がなければ、このキーボードを UITextView で動作させることができたはずです。また、このバックスペースは一般的ではなく、最後の文字を削除するだけですが、deleteBackward はユーザーがカーソルを移動しても適切に機能します。
関数 enterPress はエンター キーを実装しますが、Apple はエンター キーを呼び出す方法を提供していないように見えるため、完全なクラッジです。したがって、enterPress は、ほとんどのプログラマーが実装する UITextField のデリゲート関数 textFieldShouldReturn: を呼び出すだけです。ここでのデリゲートは、UITextField の UITextFieldDelegate であり、キーボード自体のデリゲート プロパティではないことに注意してください。
このソリューションは、通常のキーボード処理を回避します。これは、UITextField の場合はほとんど問題になりませんが、編集中のテキストに改行を挿入する方法があるため、UITextView ではこの手法を使用できなくなります。
それだけです。これを機能させるには、24時間の読書とコブリングが必要でした. それが誰かに役立つことを願っています。