プログラムによってツールバーをiPhoneキーボードの上に配置する


94

いくつかのケースでは、iPhoneキーボードの上部にツールバーを追加したいと思います(たとえば、フォーム要素をナビゲートしているときのiPhone Safariのように)。

現在、ツールバーの長方形を定数で指定していますが、インターフェイスの他の要素が流動的であるため、ツールバーと画面上部のナビゲーションバーです。インターフェイスに小さな変更を加えるたびに、ツールバーが整列しなくなります。

現在のビューに対するキーボードの位置をプログラムで決定する方法はありますか?

回答:


142

iOS 3.2以降、この効果を実現する新しい方法があります。

UITextFieldsまたUITextViewsinputAccessoryView任意のビューに設定できるプロパティがあり、自動的に上に表示され、キーボードでアニメーション化されます。

使用するビューは、他の場所のビュー階層にある必要はなく、スーパービューに追加する必要もないことに注意してください。これは自動的に行われます。


私が試してみましょう 。それが最善の方法に見えますが。
harshalb 2010

ワオ。なんという発見だ!おかげで(私はそれを難し​​い方法でやった、それは厄介です)
騒々しい

1
バーボタンアイテムの1つの中にUITextFieldを持つUIToolbarがありますが、最初に押すとtextFields inputAccessoryViewがそのツールバーに設定されますが、ツールバーは表示されますが、キーボードは表示されません。2回目に押すと、キーボードが表示され、ツールバーが表示されます。
Ugur Kumru

しかし、UIWebViewにツールバーを追加する方法は?:(
Dmitry

標準のUIWebViewツールバーのボタンを置き換えることでそれを実行しました(削除する場合と同じコード)。
ドミトリー

72

だから基本的に:

initメソッドで:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil];
[nc addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil];

次に、上記の方法でバーの位置を調整します。

-(void) keyboardWillShow:(NSNotification *) note
{
    CGRect r  = bar.frame, t;
    [[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &t];
    r.origin.y -=  t.size.height;
    bar.frame = r;
}

ラップして位置の変化をアニメーション化することで、きれいにすることができます

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
//...
    [UIView commitAnimations];

今朝私の古いものをぶらついていて、これがはるかに優れた最も包括的な答えであることに気づきました。ありがとう!
Rob Drimmie 2009

この回答は、1年後もまだかなり関連しています。これに関連する何かを開発するとき、それは私がこぶを乗り越えるのを助けました。
james_womack 2010

2
この質問に出くわした人々への警告です:UIKeyboardBoundsUserInfoKeyはiPhone OS 3.2で非推奨になりました。UIKeyboardFrameBeginUserInfoKey同じ情報を提供するような、他の類似したものがあります。
スティーブンダーリントン2010

9
iOS3.2では、UITextFieldとUITextViewのinputAccessoryViewプロパティを実行するためのより良い新しい方法があります。
tonklon 10/07/23

6
この回答は非常に役に立ちましたが、少し日付が遅れています。を使用UIKeyboardFrameEndUserInfoKeyして、キーボードの最終フレーム(画面座標)を取得する必要があります。UIKeyboardAnimationDurationUserInfoKeyおよびUIKeyboardAnimationCurveUserInfoKeyを使用して、キーボードの動作と正確に一致させるために必要な残りのパラメーターを取得することもできます。
デイブ・ペック

60

これはtonklonから既存の回答に基づいています -キーボードの上部にある半透明の黒いツールバーと右側の[完了]ボタンを表示するコードスニペットを追加しています:

UIToolbar *toolbar = [[[UIToolbar alloc] init] autorelease];
[toolbar setBarStyle:UIBarStyleBlackTranslucent];
[toolbar sizeToFit];

UIBarButtonItem *flexButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
UIBarButtonItem *doneButton =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(resignKeyboard)];

NSArray *itemsArray = [NSArray arrayWithObjects:flexButton, doneButton, nil];

[flexButton release];
[doneButton release];
[toolbar setItems:itemsArray];

[aTextField setInputAccessoryView:toolbar];

そして-resignKeyboard次のようになります:

-(void)resignKeyboard {
  [aTextField resignFirstResponder];
}

それが誰かを助けることを願っています。


2
次の前のものを配置することについて少しコメントを追加するだけです。UISegmentedControl * segmentControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@ "Previous"、@ "Next"、nil]]; [segmentControl setSegmentedControlStyle:UISegmentedControlStyleBar]; [segmentControl addTarget:self action:@selector(nextPrevious :) forControlEvents:UIControlEventValueChanged];
Trausti Thor

1
@TraustiThorのコメントへの追加:セグメント化されたコントロールをUIBarButtonItemでラップして、ツールバーに追加する必要があります。
TimBüthe12年

すばらしい-これが私が必要としたすべてのコードです。投稿してくれてありがとう:)
Stretch

しかし、UIWebViewはどうでしょうか。それにツールバーを追加する方法は?
ドミトリー

24

キーボード通知(UIKeyboardWillShowNotification UIKeyboardWillHideNotificationなど)を登録すると、受け取る通知にはuserInfodict 内のキーボードの境界が含まれます(UIKeyboardBoundsUserInfoKey)に。

参照UIWindowクラス参照を。


16

3.0以降では、アニメーション期間とカーブを userInfoは、通知のディクショナリ。

たとえば、キーボードのスペースを確保するためにビューのサイズをアニメーション化するには、に登録しUIKeyboardWillShowNotification、次のようにします。

- (void)keyboardWillShow:(NSNotification *)notification
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
    [UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];

    CGRect frame = self.view.frame;
    frame.size.height -= [[[notification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue].size.height;
    self.view.frame = frame;

    [UIView commitAnimations];
}

についても同様のアニメーションを実行しUIKeyboardWillHideNotificationます。


3.0 SDKでそれを行うためのより良い方法のように見えます投稿ありがとうございます!
Hua-Ying、

コードをありがとう。これは非常に役立ちます。しかし、UITextViewをviewDidLoadの最初のレスポンダーになるように設定すると、UIToolBarはself.viewのサイズ変更に伴って移動しません。なぜか分かりますか?
RyanJM 2010

1
@RyanJM:ビューが画面外にある場合、becomeFirstResponderとresignFirstResponderの動作がおかしい。代わりに、viewWillAppearメソッドからbecomeFirstResponderを呼び出す必要があります。
David Beck

0

このメソッドを作成し、ViewWillLoadで呼び出します。

        - (void) keyboardToolbarSetup
{
    if(self.keyboardToolbar==nil)
        {
        self.keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)];

        UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(anyAction)];

        UIBarButtonItem *extraSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

        UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(anyOtherAction)];


        NSArray *toolbarButtons = [[NSArray alloc]initWithObjects:cancelButton,extraSpace,doneButton, nil];

        [self.keyboardToolbar setItems:toolbarButtons];

        self.myTextView.inputAccessoryView=self.keyboardToolbar;
        }
}

-3

キーボードビューの寸法を取得する方法(AFAIK)はありません。ただし、少なくともこれまでのすべてのiPhoneバージョンでは一定です。

ツールバーの位置をビューの下部からのオフセットとして計算し、ビューのサイズを考慮する場合、ナビゲーションバーが存在するかどうかを心配する必要はありません。

例えば

#define KEYBOARD_HEIGHT 240 // example - can't remember the exact size
#define TOOLBAR_HEIGHT 30

toolBarRect.origin.y = viewRect.size.height - KEYBOARD_HEIGHT - TOOLBAR_HEIGHT;

// move toolbar either directly or with an animation

定義する代わりに、簡単に keyboardHeightキーボードが表示されているかどうかに基づいてサイズを返す関数をこのツールバーの位置をレイアウトを再編成する別の関数に移動できます。

また、ビューのサイズは、ナビゲーションバーの設定に基づいてロードと表示が切り替わる可能性があるため、この配置をどこで行うかによっても異なります。私はそれを行うのに最適な場所はviewWillAppearにあると思います。


これはうまくいきました、ありがとう!これまでのところ、UIKeyboardDidShowNotificationによってトリガーされるセレクターでこの計算を行ってきました。私はいくつかの場所でテストしただけですが、それは良い場所のようです。
Rob Drimmie、2008年

5.0以降、キーボードのサイズは静的ではなくなりました。
Alastair Stuart
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.