キーボードが表示されたときに画面を動かす

iPhoneアプリでテキスト入力をするとき、出てきたキーボードの陰に文字入力エリアが隠れちゃって入力している文字が見えないことがありますよね。 そんなときには文字入力エリアを見える位置まで動かして入力しやすくすると、ぐっと使いやすくなります。

(以下のコードは、目的のViewのUIViewControllerクラスに実装します。)

Viewにスクロールビューをおく

まず、UIScrollViewを作ります。 とはいっても、この処理をするときに UIScrollView が絶対に必要というわけではないんです。 部品一つ一つの位置を動かしていってもいいんですが、UITextFieldが画面にいくつもあるときには、UIScrollViewにのせて全部まとめて動かしちゃうほうが楽ですよね。

なので、ここでは View の上にUIScrollViewをおいて、その上にUITextFieldを二つ配置しています。

- (void)viewDidLoad
{
  [super viewDidLoad];

  // スクロールビューを作成します。
  myScrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
  [self.view addSubview:myScrollView];
  [myScrollView release];

  //スクロールビューの上にUITextFieldを一つおきます。
  UITextField* inputText1 = [[[UITextField alloc] initWithFrame:CGRectMake(10,250,190,30)] autorelease];
  inputText1.borderStyle = UITextBorderStyleRoundedRect;
  inputText1.returnKeyType = UIReturnKeyDone;
  inputText1.delegate = self;
  [myScrollView addSubview:inputText1];

  //スクロールビューの上にUITextFieldをもう一つおきます。
  UITextField* inputText2 = [[[UITextField alloc] initWithFrame:CGRectMake(10,300,190,30)] autorelease];
  inputText2.borderStyle = UITextBorderStyleRoundedRect;
  inputText2.returnKeyType = UIReturnKeyDone;
  inputText2.delegate = self;
  [myScrollView addSubview:inputText2];

  // キーボードが表示されたときのNotificationをうけとります。(後で)
  [self registerForKeyboardNotifications];
}

ここまでで、だいたいこんな感じの画面になります。 画面の下半分にUITextFieldがあるので、文字入力をしようとすると確実にキーボードに隠れてしまいますね。

キーボードが表示されたときのNotificationを取得する

さて、キーボードが表示されたり隠されたりするときにNotificationを受け取るには、NotificationCenterに登録する必要があります。

下記のように UIKeyboardDidShowNotification の Notification がきたときには keyboardWasShown を呼び、 UIKeyboardWillHideNotification の Notification がきたときには keyboardWillBeHidden を呼ぶようにしておきます。

viewDidLoadで、このregisterForKeyboardNotifications関数を呼んでおきます。

ちなみに、UIKeyboardDidShowNotification はキーボードが表示された直後の Notification、UIKeyboardWillHideNotification はキーボードが隠される直前の Notification です。

- (void)registerForKeyboardNotifications
{
  [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(keyboardWasShown:)
    name:UIKeyboardDidShowNotification object:nil];
  [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(keyboardWillBeHidden:)
    name:UIKeyboardWillHideNotification object:nil];
}

キーボードが表示されたときに画面全体を動かす

次に、Notificationがきたときに呼ばれる関数を作ります。

ここではシンプルに、キーボードが表示されたらUIScrollViewを200だけ上にずらして、キーボードが隠されたら元の位置に戻す処理にしています。 実際には、入力中のUITextFieldの位置や、表示されているキーボードのサイズなどをもとにもっと細かく制御したほうがよいでしょう。

- (void)keyboardWasShown:(NSNotification*)aNotification
{   
  CGPoint scrollPoint = CGPointMake(0.0,200.0);
  [myScrollView setContentOffset:scrollPoint animated:YES];
}

- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{   
  [myScrollView setContentOffset:CGPointZero animated:YES];
}

Returnキーを押せばキーボードが隠れるようにする

さて、最後にUITextFieldの入力時にReturnキーを押すとキーボードが隠れるようにします。

下記の関数を実装し、UITextFieldのreturnKeyTypeとdelegateを設定します。(上のコードで設定済み。)

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
  [textField resignFirstResponder];
  return YES;
}

ViewControllerのヘッダーファイルにこんな感じでUITextFieldDelegateのプロトコルをつければ完了です。

@interface ViewController : UIViewController<UITextFieldDelegate>{
    UIScrollView *myScrollView;
}

実際の動作

さて、実際に動かして、UITextFieldに文字を入力してみましょう。 文字を入力しようとすると、画面全体がこんな感じに上にスクロールして、文字が入力しやすくなるはずです。

この処理をしておくと、格段に入力しやすくなるのでおすすめです。