web-dev-qa-db-ja.com

カスタムキーボードを作成する方法

UITextFieldをタップすると表示されるカスタムキーボード/キーパッドを作成するにはどうすればよいですか?私は、a、b、c、1、2、3とEnterボタンを備えたキーパッドを表示したいと思います。キーパッドは標準のキーボードと同じように機能し、動作するはずです(動作中)が、見た目は間違いなく異なります。

私は例を見つけることができず、私が見つけた最高の方法は、受け入れられない解決策である既存のキーボードで文字をフィルタリングすることです。

56
HM1

iOS用テキスト、Web、および編集プログラミングガイド 」を探していると思います

UIKitフレームワークには、カスタム入力ビューと入力アクセサリビューのサポートが含まれています。ユーザーがビュー内のテキストやその他の形式のデータを編集するとき、アプリケーションはシステムキーボードの代わりに独自の入力ビューを使用できます。たとえば、アプリケーションはカスタム入力ビューを使用して、ルーン文字の文字を入力できます。入力アクセサリビューをシステムキーボードまたはカスタム入力ビューに添付することもできます。このアクセサリビューはメイン入力ビューの上部に沿って実行され、たとえば、何らかの方法でテキストに影響を与えるコントロールや、テキストに関する情報を表示するラベルを含めることができます。

アプリケーションがテキスト編集にUITextViewおよびUITextFieldオブジェクトを使用している場合にこの機能を使用するには、inputViewおよびinputAccessoryViewプロパティにカスタムビューを割り当てるだけです。これらのカスタムビューは、テキストオブジェクトがファーストレスポンダーになったときに表示されます...


これは良い入門書として役立つかもしれません: iOSキーボードのカスタマイズ

38
Jonah

Githubで Custom-iOS-Keyboards ライブラリを使用できます。

まず、ビューを作成します(別のnibファイルで作成し、この方法でロードしました)。

    NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"ReducedNumericKeyboardView"
                                                   owner:self
                                                 options:nil];
    keyBView = (ReducedNumericKeyboardView*)[views objectAtIndex:0];

その後、使用したいテキストフィールドの入力ビューとして設定します(実際、これはあなたの質問に対する短い回答です;))。

    [self.propertyEditor setInputView:keyBView];  

フィールドをクリックすると、フィールドを覆わないようにビュー子犬をスクロールします(必要な場合)。

CGRect textFieldRect = [self.tableViewController.view.window convertRect:propertyEditor.bounds fromView:propertyEditor];
CGRect viewRect = [self.tableViewController.view.window convertRect:self.tableViewController.view.bounds fromView:self.tableViewController.view];
CGFloat midLine = textFieldRect.Origin.y+.5*textFieldRect.size.height;

CGFloat numerator = midLine - viewRect.Origin.y - MINIMUM_SCROLL_FRACTION*viewRect.size.height;
CGFloat denominator = (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION)*viewRect.size.height;
CGFloat heightFraction = MIN(1, MAX(0, numerator/denominator));

animateDistance = floor(PORTRAIT_USER_INPUT_VIEW_HEIGHT*heightFraction);

CGRect viewFrame = self.tableViewController.view.frame;
viewFrame.Origin.y -= animateDistance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:USER_INPUT_ANIMATION_DURATION];
[self.tableViewController.view setFrame:viewFrame];
[UIView commitAnimations];

編集が終了したら、ビューを下にスクロールします。

        CGRect viewFrame = self.tableViewController.view.frame;
        viewFrame.Origin.y += animateDistance;
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationDuration:USER_INPUT_ANIMATION_DURATION];
        [self.tableViewController.view setFrame:viewFrame];
        [UIView commitAnimations];

使用する制約は次のように設定されています。

static const CGFloat USER_INPUT_ANIMATION_DURATION = 0.3;
static const CGFloat PORTRAIT_USER_INPUT_VIEW_HEIGHT = 180;

static const CGFloat MINIMUM_SCROLL_FRACTION = 0.1;
static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.2;
3
GeT

残念ながら、上記で参照した「iOS用のテキスト、Web、および編集プログラミングガイド」では、キーを押した後のキャラクターの対処方法に関する情報は提供されていません。これは、iOSでキーボードを実装する際のはるかに難しい部分です。

必要に応じて簡単にカスタマイズできる16進数のパッドの完全な実例を作成しました。

特定の詳細は、このテーマに関する他の回答にあります: https://stackoverflow.com/a/13351686/937822

2
lnafziger

値を設定したい

inputView

uITextFieldで。指定したビューに新しいキーボードまたは入力メカニズムを完全に実装する必要があります。

あるいは、

inputAccessoryView 

少量の機能を追加するために使用できます。ビューはシステムキーボードの上に配置され、到着して閉じられます。

2
bshirley