Hatena::ブログ(Diary)

このブログは証明できない。

2009-12-24

[]iPhone SDKで、コンテンツがキーボードで隠れないようにする。

クリスマスケーキと、子どもたちのプレゼントをゲットしてきました。リア充です。クリスマスとは関係ないですが、KPF熊本プログラミングフリークス)のvalvallowさんのブログ記事が大ヒットしていますね。彼と話していると、この手の話がポンポン飛び出してきてオモシロイです。


9LISPのブログは私が書いていますが、ブックマークの方はvalvallowさんが大量に集めてくれています。こちらも要チェック!




クリスマスともLISPとも関係ないですが、iPhone SDKの話です。縦にテキストフィールドを並べたときなどに、下のほうのテキストフィールドを編集しようとすると、キーボードが表示されて隠れてしまうことがあります。その対処法。Appleの公式ドキュメントです。

この中から、抜粋。と補足。


処理の流としては。

  1. キーボードのサイズを取得する。
  2. Scroll Viewの高さからキーボードの高さを差し引く。
  3. 編集対象のText Fieldが表示されるようにスクロールする。

activeField変数には、アクティブなフィールドが格納されています。あ、英語をカタカナにしただですね。この変数は、textFieldDidBeginEditing:デリゲートメソッドが呼び出されたときに設定されます。参考。


keyboardShown変数は、キーボードがすでに表示されているかどうかです。ヘッダファイルで定義しておきます。あとは、ViewがロードされるタイミングでregisterForKeyboardNotificationsメソッドを呼んでおきます。


- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(keyboardWasShown:)
            name:UIKeyboardDidShowNotification object:nil];
 
    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(keyboardWasHidden:)
            name:UIKeyboardDidHideNotification object:nil];
}
 
// UIKeyboardDidShowNotificationが送信されたときに呼び出される
- (void)keyboardWasShown:(NSNotification*)aNotification
{
    if (keyboardShown)
        return;
 
    NSDictionary* info = [aNotification userInfo];
 
    // キーボードのサイズを取得する
    NSValue* aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
    CGSize keyboardSize = [aValue CGRectValue].size;
 
    // Scroll View(このウインドウのルートビュー)をサイズ変更する
    CGRect viewFrame = [scrollView frame];
    viewFrame.size.height -= keyboardSize.height;
    scrollView.frame = viewFrame;
 
    // アクティブなText Fieldが表示されるようにスクロールする
    CGRect textFieldRect = [activeField frame];
    [scrollView scrollRectToVisible:textFieldRect animated:YES];
 
    keyboardShown = YES;
}
 
 
// UIKeyboardDidHideNotificationが送信されたときに呼び出される
- (void)keyboardWasHidden:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
 
    // キーボードのサイズを取得する
    NSValue* aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
    CGSize keyboardSize = [aValue CGRectValue].size;
 
    // Scroll Viewの高さを元の値に戻す
    CGRect viewFrame = [scrollView frame];
    viewFrame.size.height += keyboardSize.height;
    scrollView.frame = viewFrame;
 
    keyboardShown = NO;
}

それでは、メリークリスマス!!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/shunsuk/20091224/1261646192