8

ユーザーがテキスト フィールドとエリアの両方にテキストを入力するためのカスタム キーボードを提供する必要があります (顧客の要件など)。私はすでにキーボードを実行し、テキスト フィールドにテストを追加するものを持っていますが、それをより一般的なものにして、標準の iPhone キーボードのように動作させたいと考えています。つまり、ユーザーが編集可能なテキスト コントロールを選択したときに表示されます。現在、コントローラーはターゲットを認識しており、標準キーボードを防ぐためにターゲットは編集できません。

自分のキーボードを簡単に使用できるように、テキスト コントロールの動作にフックする方法はありますか?

ありがとう、ヴィック

4

4 に答える 4

11

アイデアは次のとおりです。既存のキーボードを自分のニーズに合わせて変更します。まず、画面に表示されたときに通知されるように登録します。

[[NSNotificationCenter defaultCenter] addObserver:self 
                                      selector:@selector(modifyKeyboard:)
                                      name:UIKeyboardWillShowNotification
                                      object:nil];

次に、あなたのmodifyKeyboard方法で:

- (void)modifyKeyboard:(NSNotification *)notification 
{
    UIView *firstResponder = [[[UIApplication sharedApplication] keyWindow] performSelector:@selector(firstResponder)];

    for (UIWindow *keyboardWindow in [[UIApplication sharedApplication] windows])
        for (UIView *keyboard in [keyboardWindow subviews])
            if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)
            {
                MyFancyKeyboardView *customKeyboard = [[MyFancyKeyboardView alloc] initWithFrame: CGRectMake(0, 0, keyboard.frame.size.width, keyboard.frame.size.height);
                [keyboard addSubview: customKeyboard];
                [customKeyboard release];
            }
}

これにより、元のキーボードの上にビューが追加されるため、必ず不透明にしてください。

于 2009-10-23T10:21:47.243 に答える
10

iOS 3.2以降で可能です。詳細については、UITextField の inputView プロパティを確認してください。

于 2011-05-02T02:11:08.663 に答える
7

アプリをアプリ ストアに提出しない限り、メソッド スウィズリングと呼ばれる手法を使用して、実行時にコア クラスのメソッドを動的に置き換えることができます。例えば:

@interface UIControl(CustomKeyboard)
- (BOOL)__my__becomeFirstResponder
@end

@implementation UIControl(CustomKeyboard)
- (BOOL)__my__becomeFirstResponder
{
    BOOL becameFirstResponder = [self __my__becomeFirstResponder];
    if ([self canBecomeFirstResponder]) {
        [MyKeyboard orderFront];
    }
    return becameFirstResponder;
}

+ (void)initialize
{
    Method old = class_getInstanceMethod(self, @selector(becomeFirstResponder));
    Method new = class_getInstanceMethod(self, @selector(__my__becomeFirstResponder));
    method_exchangeImplementations(old, new);
}
@end

本番コードでは、このようなものを使用しないでください。また、私はこれを実際にテストしていないので、YMMV.

于 2009-10-23T09:10:29.177 に答える
0

それはあなたがそれをどのようにカスタムするかによって異なります。個人的には数字のみのキーボードが欲しかったのですが、数字パッドが気に入らなかったので、標準のキーボードを使用し、標準のフィルターを追加しました。これはオプションの一部であり、数字またはスペース以外のすべてのキーの押下を拒否します。または削除します。

Apple がこれを望んでいるかどうかはわかりませんが、他のキーボードのように動作する独自の動作を作成するのは非常に困難です。それほど、それは悪い考えであると宣言されるべきです。

コメントに基づいて更新すると、多くのボタンを備えたビューを作成し、アニメーションオプションをオンにしてこのビューを移動するだけでよいように思えます。次に、キーボードのように下からスライドして、閉じると再びスライドします。

于 2009-10-22T23:45:27.390 に答える