Edited at

Auto Layoutを利用してキーボードに合わせてビューをリサイズする方法

More than 5 years have passed since last update.

iOS6から利用できるAuto Layoutを利用して、キーボードが表示・非表示になった時にUITextViewをリサイズしてみます。


Constraintの設定

UITextViewを貼り付けます。

UITextView

UITextViewのConstraintsのBottom Space to: SuperviewをView Controllerのoutletに設定します。

Vertical Space

Outlet


CTViewController.h

@interface CTViewController : UIViewController

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomConstraint;
@end


キーボード開閉を監視して再レイアウト

キーボードの開閉を監視して、constraintに値を設定して再レイアウトを行います。bottomConstraintにはキーボードの高さのマイナス値を設定します。


CTViewController.m

- (void)viewDidLoad

{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)keyboardWillShow:(NSNotification *)notification {
NSDictionary *info = [notification userInfo];
CGRect keyboardFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
NSTimeInterval duration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

self.bottomConstraint.constant = keyboardFrame.size.height;

[UIView animateWithDuration:duration animations:^{
[self.view layoutIfNeeded];
}];
}

- (void)keyboardWillHide:(NSNotification *)notification {
NSDictionary *info = [notification userInfo];
NSTimeInterval duration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

self.bottomConstraint.constant = 0;

[UIView animateWithDuration:duration animations:^{
[self.view layoutIfNeeded];
}];
}


これでUITextViewをタッチすると自動的にUITextViewが縮小されてキーボードの高さにフィットするようになりました。