m
TAKEU YOSHIHARA
京都のスタートアップで働くプロダクトデザイナーです。NotaInc.という会社でGyazoScrapboxを作っています。 ものづくり、旅や山が大好きです。
2014.7.12

UIKeyboardの動きに合わせてviewをアニメーションさせる方法

UIkeyboardの動きに合わせてビューも移動させたい。以下の動画ではピンクの部分が対象のビュー。

keyboard

通常の方法
NSNotificationCenterを使い、キーボードの動きを通知。その際にキーボードの動きに合わせてビューのアニメーションを行う。キーボードのアニメーションに関するパラメータはNSNotificationCenterの引数として渡されるので、それを使用する。

問題点
NSNotificationの引数として渡されるUIKeyboardのアニメーションの動きはUIViewAnimationCurve型。しかし、UIViewのアニメーションを定義するのに必要なパラメータはUIViewAnimationOptions型。なのでUIViewAnimationCurveをUIViewAnimationOptionsに変換してあげる必要がある。UIViewAnimationOptionsはドキュメントでは4つ定義してあり、通常であればこの4つのいずれかに当てはまるはず。ところが、UIKeyboardに使われてるUIViewAnimationCurveは上記のいずれのオプションにも当てはまらない。iO7以降では、KIKeyboardのアニメーションはドキュメント非記述の設定で動いているようだ。

解決案
UIViewAnimationCurveの値を強引にUIViewAnimationOptionsに変換する。どうやらUIViewAnimationCurveをビット演算で左に16回シフトするとUIViewAnimationOptionsの値になるようだ。

- (void)keyboardWillMove:(NSNotification *)n

{

CGRect keyboardFrame = [n.userInfo[UIKeyboardFrameEndUserInfoKey]CGRectValue];


//animation params

NSTimeInterval duration = [n.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];

UIViewAnimationCurve keyboardCurve = [n.userInfo[UIKeyboardAnimationCurveUserInfoKey]intValue];

UIViewAnimationOptions keyboardOption = keyboardCurve << 16;


_bottmSpaceToInputView.constant = self.view.frame.size.height - keyboardFrame.origin.y;


//animation action

[UIView animateWithDuration:duration delay:0.0 options:keyboardOption animations:^{

    [self.view layoutIfNeeded];

} completion:nil];

}


参考URL
https://devforums.apple.com/message/878410#878410

RELATED POSTS

POPULAR POSTS