まゆたまガジェット開発逆引き辞典

電子工作やプログラミングのHowtoを逆引き形式で掲載しています。作りたいモノを決めて学んでいくスタイル。プログラマではないので、コードの汚さはお許しを。参照していないものに関しては、コピペ改変まったく問いません

TextFieldにテキストを入力したとき画面の下が隠れてしまわないようにする方法

TextFieldにテキストを入力するとき、キーボードが下からせりあがってきて画面が隠れてしまうことがあります。
かといってTextFieldを画面上部に持っていくとなるとレイアウトが崩れる・・・というときにはscrollViewを使います。
テキストを入力したときに自動的に画面が上にスクロールされて、入力が終わると元に戻ります。

サンプルを2つ用意しました。
これは通常のViewでやったものです。GitHub - prince9/scrollViewSample: (Sorry,Japanese only)TextFieldにテキストを入力したとき、画面の下が隠れてしまわないように画面をスクロールさせる
次にこれはTabbarでやったものです。コードに違いはありませんが、一応。
GitHub - prince9/TabscrollViewSample: (Sorry,Japanese only)Tabbarを使ってTextFieldにテキストを入力したとき、画面の下が隠れてしまわないように画面をスクロールさせる

コードは以下になります(Tabbarのバージョン)。
・FirstViewController.h

@interface FirstViewController : UIViewController {
    //以下追加
    BOOL keyboardShown;
    CGPoint offset;
}
@property (weak, nonatomic) IBOutlet UIScrollView *myscrollView;
@property (weak, nonatomic) IBOutlet UITextField *myField;

@property (weak, nonatomic) IBOutlet UITextField *myField2;

@property (weak, nonatomic) IBOutlet UILabel *myLabel;
@property (weak, nonatomic) IBOutlet UILabel *myLabel2;


- (IBAction)goText1:(id)sender;
- (IBAction)goText2:(id)sender;

・FirstViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    //追加、scrollViewのサイズを設定
    self.myscrollView.contentSize = CGSizeMake(320, 411);
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardShow:) name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardHide:) name:UIKeyboardDidHideNotification object:nil];
    keyboardShown = NO;
}

//以下追加、UIKeyboardDidShowNotificationが送信されたときに実行される
- (void)keyboardShow:(NSNotification *)notificatioin {
    
    if (keyboardShown) {
        return;
    }
    
    NSDictionary *info = [notificatioin userInfo];
    
    //キーボードのサイズを取得、UIKeyboardFrameEndUserInfoKeyはiOS5以上のときに使う。iOS4.xの場合はここがUIKeyboardBoundsUserInfoKeyになる
    NSValue *keyboardValue = [info objectForKey:UIKeyboardFrameEndUserInfoKey];
    CGSize keySize = [keyboardValue CGRectValue].size;
    
    offset = myscrollView.contentOffset;
    
    //scrollViewのサイズを変更
    CGRect scrollViewFrame = myscrollView.frame;
    scrollViewFrame.size.height -= keySize.height;
    myscrollView.frame = scrollViewFrame;
    
    //スクロールする
    CGRect textFieldRect = myField.frame;
    textFieldRect.origin.y += 10;
    [myscrollView scrollRectToVisible:textFieldRect animated:YES];
    
    keyboardShown = YES;
}

//以下追加、UIKeyboardDidHideNotificationが送信されたときに実行される
- (void)keyboardHide:(NSNotification *)notificatioin {
    if (!keyboardShown) {
        return;
    }    
    
    //scrollViewをもとに戻す
    myscrollView.frame = CGRectMake(0, 0, 320, 460);
    myscrollView.contentOffset = offset;
    keyboardShown = NO;
    
}

//テキスト表示
- (IBAction)goText1:(id)sender {
    myLabel.text = myField.text;
}

//テキスト表示
- (IBAction)goText2:(id)sender {
    myLabel2.text = myField2.text;
}