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

  • 93
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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が縮小されてキーボードの高さにフィットするようになりました。